UISwitch in CustomTableCell

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UISwitch in CustomTableCell

    Hi
    Ich bin dabei eine SettingsView zu programmieren und auf folgendes Problem gestoßen.
    Meiner TableView habe ich eine CustomCell Klasse gegeben. In der habe ich ein UISwitch Element.
    In der Custom Cell Klasse habe ich die UISwitches mit onchange an eine Methode changedSwitch gebunden!

    1.) Wie kann ich in der CustomCell Klasse die einzelnen UISwitches unterscheiden und die Werte abfragen?
    2.) Wie kann ich in meinem RootViewController in der Methode cellForRowAtIndexPath (in der ich die Werte der einzelnen UISwitches aus den UserDafaults auslese) die UISwitches ansprechen?
    ==============================
    [url]http://www.austrianmultimedia.at[/url]
    [url]http://bike-blog.at[/url]
    ==============================
  • rafta2009 schrieb:

    1.) Wie kann ich in der CustomCell Klasse die einzelnen UISwitches unterscheiden und die Werte abfragen?
    Du musst für die Action die Form mit einem Parameter verwenden. Der Parameter (aka Sender) ist der Switch. Um die Zelle zu erhalten, musst Du Dich nach oben hangeln:

    Quellcode

    1. - (IBAction)changedSwitch:(id)inSender {
    2. id theParent = [inSender superview];
    3. while(theParent != nil && ![theParent isKindOfClass:[UITableViewCell class]) {
    4. theParent = [theParent superview];
    5. }
    6. // theParent enthält die Zelle
    7. }

    rafta2009 schrieb:

    2.) Wie kann ich in meinem RootViewController in der Methode cellForRowAtIndexPath (in der ich die Werte der einzelnen UISwitches aus den UserDafaults auslese) die UISwitches ansprechen?
    Dazu solltest Du dem Switch einen Tag verpassen. Der Tag ist einfah eine Zahl, die Du über den IB oder programmatisch einem View über die Property tag zuweisen kannst. Über die Methode viewWithTag: kannst Du dann den Switch wiederfinden:

    Quellcode

    1. UISwitch *theSwitch = (UISwitch *) [theCell viewWithTag:12345];
    „Meine Komplikation hatte eine Komplikation.“
  • Vielen Dank für die schnelle Antwort:
    ich habe es geschafft theParent auszugeben:

    theParent: <CellWithSwitch: 0x5a5bb00; baseClass = UITableViewCell; frame = (0 135; 320 44); autoresize = W; layer = <CALayer: 0x5a57770>>

    (aber eine Ebene darüber)
    Wenn ich jedoch das NSLog in die while schreibe, erhalte ich gar keine ausgabe

    Quellcode

    1. - (IBAction)changedSwith:(UISwitch *)sender {
    2. NSLog(@"Switched changed");
    3. id theParent = [sender superview];
    4. while(theParent != nil && ![theParent isKindOfClass:[UITableViewCell class]]) {
    5. theParent = [theParent superview];
    6. NSLog(@"theParent: %@",theParent);
    7. }
    8. }
    Alles anzeigen


    aber wie kann ich jetzt die Zelle auslesen?
    ==============================
    [url]http://www.austrianmultimedia.at[/url]
    [url]http://bike-blog.at[/url]
    ==============================
  • Die Variable theParent enthält am Ende der Methode die Zelle. Wenn der Superview des Switches bereits die Zelle ist, wird die Schleife nicht durchlaufen.

    Allerdings sollen laut Doku alle benutzerdefinierten Elemente einer Tabellenzelle in den View contentView gelegt werden und nicht direkt in die Zelle. Also:

    Quellcode

    1. [theCell addSubview:theSwitch]; // FALSCH
    2. [theCell.contentView addSubview:theSwitch]; // Richtig
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Die Variable theParent enthält am Ende der Methode die Zelle. Wenn der Superview des Switches bereits die Zelle ist, wird die Schleife nicht durchlaufen.

    Allerdings sollen laut Doku alle benutzerdefinierten Elemente einer Tabellenzelle in den View contentView gelegt werden und nicht direkt in die Zelle. Also:

    Quellcode

    1. [theCell addSubview:theSwitch]; // FALSCH
    2. [theCell.contentView addSubview:theSwitch]; // Richtig


    ich habe meinen code jetzt geändert.

    Quellcode

    1. UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
    2. // Configure the cell.
    3. NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    4. UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
    5. [cell.contentView addSubview:mySwitch];
    6. // cell.accessoryView = mySwitch;
    7. //[(UISwitch *)cell.contentView addTarget:cell action:@selector(changedSwith:) forControlEvents:UIControlEventValueChanged];
    8. [mySwitch addTarget:cell action:@selector(changedSwith:) forControlEvents:UIControlEventValueChanged];
    9. if (indexPath.section == 0) {
    10. if (indexPath.row == 0) {
    11. cell.lableHeadline.text = NSLocalizedString (@"alleAlarme",@"All Alerts");
    12. if (![prefs boolForKey:@"alleAlarme"]) {
    13. [(UISwitch *)cell.accessoryView setOn:YES];
    14. }
    15. else {
    16. [(UISwitch *)cell.accessoryView setOn:NO];
    17. }
    18. }
    19. }
    Alles anzeigen

    in der customcell mache ich

    Quellcode

    1. - (IBAction)changedSwith:(UISwitch *)sender {
    2. NSLog(@"Switched changed");
    3. id theParent = [sender superview];
    4. NSLog(@"theParent1: %@",theParent);
    5. while(theParent != nil && ![theParent isKindOfClass:[UITableViewCell class]]) {
    6. theParent = [theParent superview];
    7. NSLog(@"theParent2: %@",theParent);
    8. }
    9. }
    Alles anzeigen

    und bekomme folgende ausgabe
    "theParent1: <UITableViewCellContentView: 0x5a55800; frame = (10 1; 300 43); layer = <CALayer: 0x5a55860>>
    theParent2: <CellWithSwitch: 0x5a555c0; baseClass = UITableViewCell; frame = (0 46; 320 45); autoresize = W; layer = <CALayer: 0x5a556a0>>"
    aber keine cell?
    denke ich vollkommen falsch.
    sorry
    ==============================
    [url]http://www.austrianmultimedia.at[/url]
    [url]http://bike-blog.at[/url]
    ==============================

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rafta2009 ()

  • rafta2009 schrieb:

    denke ich vollkommen falsch.

    Heißt die Klasse für die Tabellenzelle nicht CellWithSwitch? Aktionen sollten übrigens nicht an den View sondern an den Controller gesendet werden, also

    Quellcode

    1. [mySwitch addTarget:self action:@selector(changedSwith:) forControlEvents:UIControlEventValueChanged];
    und die Methode changedSwith: gehört somit auch in den Controller.
    „Meine Komplikation hatte eine Komplikation.“
  • Updates --> Ausgabe

    Hi macmoonshine

    Vielen Danke für Deine Ausführungen. Habe den Code nach Deinen Empfehlungen geändert. Funktioniert!!!
    Eine Frage bleibt noch offen.
    Ich hätte ja gerne die Zellenummer (beginnend bei [0,0])
    bekomme aber

    Quellcode

    1. <CellWithSwitch: 0xcd0aa20; baseClass = UITableViewCell; frame = (0 46; 320 45); autoresize = W; layer = <CALayer: 0xcd0ab30>>

    wenn ich theParent als %i ausgeben lasse bekomme ich

    Quellcode

    1. 97618064
    und ähnliche Zahlen?
    Kurze Erklärung wäre super!
    Und danke noch mal herzlich!
    Liebe Grüße aus Ö!
    Raphael
    ==============================
    [url]http://www.austrianmultimedia.at[/url]
    [url]http://bike-blog.at[/url]
    ==============================
  • Die Zellen wissen nicht, wo sie sich befinden. Wenn Du diese Information brauchst, musst Du sie in der Zelle abspeichern. Am einfachsten legst Du eine Property für NSIndexPath an, die Du in der Methode tableView:cellForRowAtIndexPath: zuweist.

    Wenn Du diesen Wert in der Log-Ausgabe haben möchtest, musst Du die Methode description überschreiben.

    Dass Du große, unverständliche Zahlen als Ausgabe bekommst, wenn Du einen Zeiger mit dem Format %i ausgibst, finde ich nicht verwunderlich. Das ist einfach der dezimale Wert der Adresse, an dem sich die Zelle im Hauptspeicher befindet.
    „Meine Komplikation hatte eine Komplikation.“