2010-12-31 3 views
0

So habe ich einen View-Controller mit einem einzigen UITableView, die eine Zeichenfolge für den Benutzer zeigt. Aber ich brauchte einen Weg, um den Benutzer dieses Objekt mit Hilfe einer normalen UIButton per ID auswählen zu lassen, so dass ich es als Unteransicht hinzufügte und das Klickereignis wie erwartet funktioniert.Wie übergeben Sie einen int-Wert auf UIButton klicken Sie in UITableView

Das Problem ist das - wie kann ich einen Int-Wert an dieses Klickereignis übergeben? Ich habe versucht, Attribute der Schaltfläche wie button.tag oder button.accessibilityhint ohne viel Erfolg zu verwenden. Wie übergeben die Profis einen solchen Wert?

Auch ist es wichtig, dass ich den tatsächlichen [x intValue] von der Int später im Prozess erhalten kann. Eine Weile zurück dachte ich, ich könnte dies mit einem einfachen

NSLog tun (@ "der tatsächlich ausgewählte Hut war% d", [obj.idValue intValue]);

Aber das scheint nicht zu funktionieren (keine Ahnung, wie ich den tatsächlichen int-Wert direkt aus der Variablen ziehen kann?).

Der Arbeits Code, den ich habe, ist unter

- (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]; 
    } 

    if ([self.hats count] > 0) { 
     Hat* obj = [self.hats objectAtIndex: [indexPath row]]; 

    NSMutableString* fullName = [[NSMutableString alloc] init]; 
    [fullName appendFormat:@"%@", obj.name]; 
    [fullName appendFormat:@" %@", obj.type]; 

    cell.textLabel.text = fullName; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

    //add the button to subview hack 
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    button.frame = CGRectMake(50, 5, 50, 25); 
    [button setTitle:@"Select" forState:UIControlStateNormal]; 
    button.backgroundColor = [UIColor clearColor]; 
    button.adjustsImageWhenHighlighted = YES; 

    button.tag = obj.idValue; //this is my current hack to add the id but no dice :(

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

    [cell.contentView addSubview:button]; 
    //hack 
    } 

    return cell; 
} 

- (void)action:(id)sender { 
    int* hatId = ((UIButton *)sender).tag; //try to pull the id value I added above ... 

    //do something w/ the hatId 
} 
+0

Sie sagen NSLog (@ "der tatsächlich ausgewählte Hut war% d", [obj.idValue intValue]); funktioniert nicht, also stellst du es vielleicht nie ein.Weil ich dasselbe mache, indem ich das Tag setze und es in der Aktionsmethode vom Absender lese, aber für mich funktioniert es. –

+0

Benötigen Sie sowohl eine Zubehörtaste als auch Ihre "Select" -Taste? Wenn eine Zubehörtaste angetippt wird, ruft sie accessoryButtonTappedForRowWithIndexPath auf, so dass keine Markierung erforderlich ist. – Anna

+0

Ich benutze die Zubehörtaste für eine Detailansicht des Hutes, die Auswahl fügt nur den spezifischen Hut zu einem Einkaufswagen für die Kasse hinzu/etc –

Antwort

0

Die endgültige Lösung von wenigen Änderungen bestand aus:

1.) Anstelle vom Typ int mit I NSNumber geschaltet (dank ein paar der Kommentare) auch fand ich int eher ein Problem zu sein, wenn es darum geht, Speicherverwaltung, weil ich neu bin :(

2.) Anstatt das Tag auf eine ID setzen Ich habe einige Konzepte in den Kommentaren erwähnt und schob das gesamte Objekt, um mehr Details darüber zu erhalten, wenn ich zog es von der Handlung später. Hier

ist die überarbeitete Methode, wo ich das Objekt gesetzt

if ([self.hats count] > 0) { 
     Hat* obj = [self.hats objectAtIndex: [indexPath row]]; 

    NSMutableString* fullName = [[NSMutableString alloc] init]; 
    [fullName appendFormat:@"%@", obj.name]; 
    [fullName appendFormat:@" %@", obj.type]; 

    cell.textLabel.text = fullName; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

    //add the button to subview hack 
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    button.frame = CGRectMake(50, 5, 50, 25); 
    [button setTitle:@"Select" forState:UIControlStateNormal]; 
    button.backgroundColor = [UIColor clearColor]; 
    button.adjustsImageWhenHighlighted = YES; 

    button.tag = obj; 

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

    [cell.contentView addSubview:button]; 
    //hack 
    } 

    return cell; 
} 

Und hier ist die überarbeitete Aktion, wo ich das Objekt herausziehen, dann ist jede Eigenschaft Ich möchte

- (void)action:(id)sender { 
    Hat* obj = ((UIButton *)sender).tag; 
    NSNumber* hatId = obj.idValue; 
    //then if I wanted the actual value of hatId I could do 
    NSLog(@"print the hatId out as is %d", [hatId intValue]); 
} 

Ein letzter Kommentar die erwähnte Knopfwiederbenutzung - ich muß noch ein laufendes Problem mit diesem finden, aber ich interessiere mich für eine andere Lösung, die mir noch erlauben würde, eine kundenspezifische Taste in jeder Tabellenzelle zu haben.

2
NSInteger hatId = ((UIButton *)sender).tag; 
+0

Ich glaube nicht, dass Sie * brauchen, wenn Sie einen Int verwenden –

1

ich darüber in eine ganz andere Art und Weise gehen. Ich hätte ein NSMutableDictionary, das Schaltflächenobjekte mit dem Tag als Schlüssel enthielt. Wahrscheinlich in der Datenquelle der Tabelle. Wenn dann etwas mit dem Knopf oder dem Tag passiert, können Sie leicht auf den einen oder den anderen zugreifen. Wenn Sie dann einen Tag für eine bestimmte Schaltfläche benötigen, können Sie die allKeysForObject-Methode für das Wörterbuch verwenden, die wahrscheinlich nur eine pro Objekt ist. Wenn Sie die Schaltfläche für das Tag benötigen, können Sie das Tag als Schlüsselwert verwenden, um den Tastenzeiger zu erhalten. Dies setzt voraus, dass Tag-Werte nicht wiederverwendet werden und eindeutig sind (wenn sie gelöscht werden sollen, müssen Sie sie aus dem Wörterbuch löschen, wenn die Schaltflächen nicht mehr vorhanden sind).

Alternativ können Sie auch UIButton ableiten und den Tag-Wert besser speichern. Ich denke, ein Idealist würde dir sagen, dass dies die Antwort ist, soweit du versuchst, es mit deinem Hack arbeiten zu lassen. =)

Hoffe, dass das hilft.

Verwandte Themen