2011-01-03 4 views
30

Ich habe ein einfaches Problem. Ich habe eine benutzerdefinierte UITableViewCell erstellt, die einen UISwitch in Interface Builder enthält.Wie erstelle ich ein UITableViewCell mit einem UISwitch und bekomme die Daten?

Frage 1: Einfacher, besserer Weg, es zu tun? Frage 2: Was wäre bei Verwendung in einem UITableViewController der beste Weg, um die Daten zu bekommen? Irgendwann muss ich entweder durch die Tabelle gehen und jede Zelle auf den Status überprüfen ODER eine Rückmeldung senden, wenn sich der Status der Schalter direkt ändert?

Danke für die Hilfe.

Antwort

83

Sie könnten einfach die UISwitch in Ihrer Zubehöransicht hinzufügen. Das ist der einfachste Weg, um es zu tun, ganz zu schweigen davon, dass es "elegant" aussieht.

Dann könnten Sie in Ihrem Tableview-Controller-Code bei jedem Wechsel des Switches einfach einen Selector aufrufen oder den Switch selbst umschalten, indem Sie den aktuellen Status des Switches in Ihrem Controller abrufen.

Lassen Sie wissen, ob Sie ein Codebeispiel möchten.

--- Beispielcode ---

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    //add a switch 
    UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    cell.accessoryView = switchview; 
    [switchview release]; 
} 

cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; 

return cell; 
} 

Dann könnten Sie eine Methode, die einen Schalter auf Änderungen in Ihrem Modell auf Basis aktualisiert. Sie könnten, was Sie wollen verwenden - Delegierte, Benachrichtigungen, KVO usw.

Beispiel:

- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
UISwitch *switchView = (UISwitch *)cell.accessoryView; 

if ([switchView isOn]) { 
    [switchView setOn:NO animated:YES]; 
} else { 
    [switchView setOn:YES animated:YES]; 
} 

} 
+0

code smaple wäre toll, danke – eemceebee

+0

Bearbeitet, um einige Beispielcode enthalten. –

+0

Ich frage mich, ob Sie ein Beispiel in Bezug auf KVO für UISwitch verwendet haben. Ich versuche zu implementieren wie 'UISwitch * switchview = [[UISwitch Alloc] initWithFrame: CGRectZero]; Zelle.AccessoryView = Switchview; [Switch addObserver: Selbst forKeyPath: @ "auf" Optionen: NSKeyValueChangeSetting Kontext: NULL], 'aber meine Funktion' - (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) Objekt ändern: (NSDictionary *) Änderung Kontext: (void *) Kontext { NSLog (@ "observeValueForKeyPath"); } 'nicht aufgerufen werden, wenn Schalter Wert – user454083

3

zwei Optionen:

1) Ihre Zelle mit einem Zeiger auf Ihr Datenmodell initialisieren. Lassen Sie die Zelle den Delegaten-Rückruf für den Switch implementieren. Wenn sich der Schalter ändert, verwenden Sie den Zeiger zu Ihrem Datenmodell, um die neue Einstellung wiederzugeben. Alternativ initialisieren Sie die Zelle mit einem Zeiger auf Ihren View-Controller. Lassen Sie die Switch-Delegate-Methode von der Zelle implementieren und rufen Sie dann mit den entsprechenden Zellenkontextinformationen in Ihren View-Controller zurück.

2) Lassen Sie Ihren View-Controller den Switch-Delegate-Callback implementieren. Wenn sich der Switch ändert, bestimmen Sie, welcher Switch/Zelle er war (möglicherweise muss die Eigenschaft "tag" des Switches als Zeilennummer oder so konfiguriert werden) und die Aktualisierung im Kontext des View-Controllers vornehmen.

4

Dank. Ich habe Ihre indexPath nicht, aber Sie können eine Zelle oder ein Objekt identifizieren, die mit einem Tag wie folgt:

if (indexPath.row == 0) { 
     cell.textLabel.text = @"Twitter"; 


     UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero]; 
     switchview.tag = 111; 
     //switchview.selected = 0; 
     cell.accessoryView = switchview; 

     [switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside]; 

     //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator; 
     //[switchview release]; 

    } 


- (void)updateSwitchAtIndexPath { 

for (UITableViewCell * cell in tblView.subviews) { 

    for (UISwitch *swch in cell.subviews) { 


     UISwitch *switchView = (UISwitch *)cell.accessoryView; 

     if (switchView.tag == 111) { 

      if ([switchView isOn]) { 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON"); 
      }else{ 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF"); 
      } 

     } 

      if (switchView.tag == 222) { 
      if ([switchView isOn]) { 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON"); 
      }else{ 
       NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF"); 
      } 

     } 
    } 
} 

}

+1

hat, während UITableViewCell konfigurieren können wir tun .. this mit Tag ** '[SwitchView AddTarget: Self-Aktion: @ Selector (UpdateSwitchAtIndexPath) forControlEvents: UIControlEventTouchUpInside] ; ' –

8
Switch.tag = indexPath.row; 
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside]; 



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{ 
    FFLog(@"%i",aswitch.tag); 
} 
+0

Danke für die klare Erklärung ... endlich funktioniert das! – Remixed123

1

Um den Wert der UISwitch in Swift 3 und Swift zu bekommen 4 Sie können ein Ziel, um es hinzuzufügen:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell { 

    ... 

    cell.uiSwitch.tag = 100 
    cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged) 

    ... 
} 

Und Sie können den Wert wie folgt erhalten:

Verwandte Themen