Ich zeige in einer Gruppe tableview
Inhalte an, die aus XML analysiert wurden. Ich möchte das Klickereignis darauf deaktivieren (es sollte überhaupt nicht möglich sein, darauf zu klicken). Die Tabelle enthält zwei Gruppen. Ich möchte die Auswahl nur für die erste Gruppe deaktivieren, aber nicht für die zweite Gruppe. Klicken Sie auf die erste Zeile der zweiten Gruppe navigates
zu meiner Tube player view
.
Wie kann ich nur bestimmte Gruppen oder Zeilen auswählbar machen?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section!=0)
if(indexPath.row==0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];
}
Vielen Dank.
Sie müssen diesen Code nur in cellForRowAtIndexPath
einfügen
So deaktivieren Sie die Auswahleigenschaft der Zelle: (während Sie auf die Zelle tippen)
cell.selectionStyle = UITableViewCellSelectionStyleNone;
So aktivieren Sie das Auswählen (Tippen) der Zelle: (Tippen auf die Zelle)
// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;
Beachten Sie, dass eine Zelle mit selectionStyle = UITableViewCellSelectionStyleNone;
bewirkt weiterhin, dass die Benutzeroberfläche didSelectRowAtIndexPath
aufruft, wenn sie vom Benutzer berührt wird. Um dies zu vermeiden, gehen Sie wie unten vorgeschlagen vor und stellen Sie ein.
cell.userInteractionEnabled = NO;
stattdessen. Beachten Sie auch, dass Sie cell.textLabel.enabled = NO;
, um das Objekt auszublenden.
Wenn Sie eine Zeile (oder eine Teilmenge von Zeilen) erstellen möchten nicht auswählbar, implementieren Sie die UITableViewDelegate
-Methode -tableView:willSelectRowAtIndexPath:
(auch von TechZen erwähnt). Wenn das indexPath
nicht auswählbar sein soll, geben Sie nil
zurück, andernfalls das indexPath
. Um das Standardauswahlverhalten zu erhalten, geben Sie einfach das indexPath
zurück, das an Ihre delegate
-Methode übergeben wurde. Sie können die Zeilenauswahl jedoch auch ändern, indem Sie ein anderes indexPath
zurückgeben.
beispiel:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// rows in section 0 should not be selectable
if ( indexPath.section == 0 ) return nil;
// first 3 rows in any section should not be selectable
if ( indexPath.row <= 2 ) return nil;
// By default, allow row to be selected
return indexPath;
}
Ab iOS 6 können Sie verwenden
-tableView:shouldHighLightRowAtIndexPath:
Wenn Sie NO
zurückgeben, werden sowohl die Auswahlhervorhebung als auch die vom Storyboard ausgelösten Segmente deaktiviert, die mit dieser Zelle verbunden sind.
Die Methode wird aufgerufen, wenn eine Zeile berührt wird. Wenn Sie zu dieser Meldung NO
zurückkehren, wird der Auswahlprozess angehalten, und die aktuell ausgewählte Zeile verliert nicht ihr ausgewähltes Aussehen, während die Berührung gedrückt wird.
Keiner der obigen Antworten spricht das Problem wirklich richtig an. Der Grund ist, dass wir die Auswahl der Zelle deaktivieren möchten, aber nicht unbedingt der Unteransichten innerhalb der Zelle.
In meinem Fall präsentierte ich einen UISwitch in der Mitte der Zeile und ich wollte die Auswahl für den Rest der Zeile (der leer ist) deaktivieren, aber nicht für den Switch! Die richtige Art, dies zu tun, liegt daher in der Methode
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
wo eine Aussage des Formulars
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
deaktiviert die Auswahl für die bestimmte Zelle, während der Benutzer gleichzeitig den Schalter manipulieren und den entsprechenden Selektor verwenden kann. Dies ist nicht der Fall, wenn jemand die Benutzerinteraktion über deaktiviert
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
methode, die lediglich die Zelle vorbereitet und keine Interaktion mit dem UISwitch zulässt.
Darüber hinaus mit der Methode
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
um die Auswahl der Zelle mit einer Anweisung des Formulars aufzuheben
[tableView deselectRowAtIndexPath:indexPath animated:NO];
zeigt weiterhin die ausgewählte Zeile an, während der Benutzer auf die ursprüngliche Inhaltsansicht der Zelle drückt.
Nur meine zwei Cent. Ich bin mir ziemlich sicher, dass viele dies nützlich finden werden.
Sie fangen Auswahlen mit diesen Datenquellenmethoden ab.
– tableView:willSelectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:
– tableView:willDeselectRowAtIndexPath:
– tableView:didDeselectRowAtIndexPath:
Bei diesen Methoden prüfen Sie, ob es sich bei der ausgewählten Zeile um eine Zeile handelt, die Sie auswählen möchten. Wenn dies der Fall ist, führen Sie eine Aktion aus. Wenn nicht, tun Sie nichts.
Leider können Sie die Auswahl nicht für nur einen Abschnitt deaktivieren. Es ist der ganze Tisch oder nichts.
Sie können jedoch die Eigenschaft selectionStyle
der Tabellenzellen auf UITableViewCellSelectionStyleNone
setzen. Ich glaube, das macht die Auswahl unsichtbar. In Kombination mit den oben genannten Methoden sollten die Zellen aus Sicht des Benutzers völlig träge aussehen.
Wenn Sie eine Tabelle haben, in der nur einige der Zeilen auswählbar sind, ist es wichtig, dass sich die Zellen der auswählbaren Zeilen visuell von den nicht auswählbaren Zeilen unterscheiden. Die Chevron-Zubehörschaltfläche ist die Standardmethode dafür.
Wie auch immer Sie es tun, Sie möchten nicht, dass Ihre Benutzer versuchen, Zeilen auszuwählen und denken, die App sei fehlerhaft, weil die Zeile nichts tut.
Für Swift 4. zum Beispiel:
cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
Sie müssen wie folgt vorgehen, um die Zellenauswahl in der cellForRowAtIndexPath
-Methode zu deaktivieren:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];
Um die abgeblendete Zelle anzuzeigen, setzen Sie Folgendes in das Feld tableView:WillDisplayCell:forRowAtIndexPath
Methode:
[cell setAlpha:0.5];
Mit einer Methode können Sie die Interaktivität steuern, mit der anderen können Sie das Erscheinungsbild der Benutzeroberfläche steuern.
Meine Lösung basiert auf Datenmodell:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
return rowDetails.enabled ? indexPath : nil
}
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
return rowDetails.enabled
}
Um zu verhindern, dass nur einige Zellen ausgewählt werden, gehen Sie wie folgt vor:
cell.userInteractionEnabled = NO;
Dies verhindert nicht nur die Auswahl, sondern verhindert auch, dass tableView: didSelectRowAtIndexPath: für die Zellen aufgerufen wird, für die es festgelegt wurde.
Du kannst den ... benutzen tableView:willDisplayCell
Methode, um alle Arten von Anpassungen an einer tableViewCell vorzunehmen.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];
if (indexPath.section == 1 && indexPath.row == 0)
{
[cell setSelectionStyle:UITableViewCellSelectionStyleGray];
[cell setUserInteractionEnabled:YES];
}
}
In diesem obigen Code kann der Benutzer nur die erste Zeile im zweiten Abschnitt der Tabellenansicht auswählen. Der Rest aller Zeilen kann nicht ausgewählt werden. Vielen Dank!
Für Swift 4.0 Dies wird den Trick tun. Es wird die Zelle in der didSelectRowAtIndexPath-Methode deaktivieren, aber die Unteransichten anklickbar halten.
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if (indexPath.row == clickableIndex ) {
return indexPath
}else{
return nil
}
}
Für Swift:
cell.selectionStyle = .None
cell.userInteractionEnabled = false
EINFACHES
Benutz einfach cell.userInteractionEnabled = YES;
zur Zelle, wenn sie navigieren kann, und cell.userInteractionEnabled = NO;
Andernfalls
Ich fand das praktisch, da es sowohl mit statischen als auch mit dynamischen Tabellen funktioniert. Ich setze das Offenlegungskennzeichen nur für die Zellen, die ausgewählt werden sollen.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
return nil;
}
return indexPath;
}
Verwenden Sie dies, um die Zelle sieht aus wie deaktiviert und nicht auswählbar zu machen:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Wichtig: Beachten Sie, dass dies nur eine Stileigenschaft ist und die Zelle nicht deaktiviert. Dazu müssen Sie in Ihrer didSelectRowAtIndexPath:
- Delegate-Implementierung nach selectionStyle
suchen:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if(cell.selectionStyle == UITableViewCellSelectionStyleNone) {
return;
}
// do your cell selection handling here
}
Ich mag Brian Chapados Antwort oben. Dies bedeutet jedoch, dass die Logik möglicherweise sowohl in cellForRowAtIndexPath als auch in willSelectRowAtIndexPath dupliziert wurde, wodurch die Synchronisation leicht verloren gehen kann. Anstatt die Logik zu duplizieren, überprüfen Sie einfach den selectionStyle:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle == UITableViewCellSelectionStyleNone)
return nil;
else
return indexPath;
}
auf Xcode 7 ohne Codierung können Sie einfach Folgendes tun:
Wählen Sie in der Gliederungsansicht Tabellensicht Zelle. (Die Zelle ist unter "Table View Controller Scene"> "Table View Controller"> "Table View" verschachtelt. Möglicherweise müssen Sie diese Objekte offenlegen, um die Zelle "Table View" anzuzeigen.)
Suchen Sie im Attribut-Inspektor das Feld Auswahl und wählen Sie Keine aus. atribute inspector Mit dieser Option erhält die Zelle keine visuelle Hervorhebung, wenn ein Benutzer darauf tippt.
Implementiere nur die Methode tableView:willSelectRowAtIndexPath:
in der Datenquelle für Ihre Tabelle. Wenn die Zeile am Pfad hervorgehoben werden soll, geben Sie den angegebenen Indexpfad zurück. Wenn Sie dies nicht tun, geben Sie nil zurück.
Beispiel aus meiner App:
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MySelectableObj* obj = [self objectAtPath:indexPath];
if(obj==nil) return nil;
return indexPath;
}
Das Schöne daran ist, dass shouldPerformSegueWithIdentifier:sender:
wird nicht aufgerufen, wenn die obige Methode nil zurückgibt, obwohl ich den obigen Test der Vollständigkeit halber wiederhole.
Für Xcode 6.3:
cell.selectionStyle = UITableViewCellSelectionStyle.None;
Ich stimme Bryans Antwort zu
wenn ich mache
cell.isUserInteractionEnabled = false
dann werden die Unteransichten in der Zelle nicht vom Benutzer interagiert.
Auf der anderen Seite Einstellung
cell.selectionStyle = .none
löst die didSelect-Methode aus, obwohl die Auswahlfarbe nicht aktualisiert wurde.
Mit willSelectRowAt habe ich mein Problem gelöst. Beispiel:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if indexPath.section == 0{
if indexPath.row == 0{
return nil
}
}
else if indexPath.section == 1{
if indexPath.row == 0{
return nil
}
}
return indexPath
}