2016-10-12 1 views
1

Ich verwende einen Code, den ich schon einmal gesehen habe. Im Wesentlichen antwortet ein Benutzer mit einem Knopf mit einem Ja oder Nein. Durch Drücken von Ja oder Nein wird die Datenbank aktualisiert, die ordnungsgemäß funktioniert. Außerdem wird die sichtbare Benutzeroberfläche aktualisiert, die nicht funktioniert. Diese Benutzeroberfläche aktualisiert die Schaltflächen, sodass sie ausgewählt, andere hervorgehoben und beide für die Benutzerinteraktion deaktiviert sind. Außerdem werden zwei UILabels geändert. Die Methode, die diese Schaltflächen aufrufen, muss die Datenbank aktualisieren und die Schaltflächen aus der TableViewCell abrufen und die Änderungen aktualisieren, damit die Methoden in einem anderen ViewController funktionieren, sodass ich den Unterschied hier nicht verstehen kann. Hier ist meine cellForRowAtIndexPathtableview viewWithTag ruft UIElements nicht ab objective-c

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSString *simpleTableIdentifier = [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row]; 
NSLog(@" simple: %@",simpleTableIdentifier); 
if (indexPath.row==0) { 
    ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:simpleTableIdentifier]; 
    } 


    cell = [self createProfileCell:cell]; 
    return cell; 

}else{ 
    YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    if (cell==nil) { 
     cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 
    cell = [self createYesNoCell:cell:indexPath]; 
    return cell; 

    } 
} 

Im Wesentlichen das, was tut, ist erstellen die Benutzer in der ersten Zelle profilieren, und lassen Sie alle Fragen, die Benutzer auffordert. Dies ist der Hauptunterschied, den ich zwischen der alten TableView und dieser TableView sehe. In createYesNoCell erstelle ich die UIElements und erstellen Tags als

cell.yesVoteButton.tag=indexPath.row+ yesVoteButtonTag1; 
    cell.noVoteButton.tag=indexPath.row+ noVoteButtonTag1; 
    cell.yesCountLabel.tag=indexPath.row+ yesCountLabelTag1; 
    cell.noCountLabel.tag=indexPath.row+ noCountLabelTag1; 

Die Tasten, um die Wähler haben, die eine Reihe von Dingen, initiiert folgt. Es findet heraus, welcher Knopf durch folgendes gedrückt wurde.

 NSInteger index; 
if(sender.tag>=yesVoteButtonTag1){ 
    NSLog(@"Yes button pressed"); 
    votedYes=true; 
    index=sender.tag-yesVoteButtonTag1; 

}else{ 
    NSLog(@"No button Pressed"); 
    votedYes=false; 
    index=sender.tag-noVoteButtonTag1; 
} 

    UILabel *yesLabel = (UILabel*) [self.tableView viewWithTag:index+yesCountLabelTag1]; // you get your label reference here 
    UIButton *yesButton=(UIButton *)[self.tableView viewWithTag:index+1+yesVoteButtonTag1]; 
    NSLog(@"Tag IN METHOD: %ld",index+yesVoteButtonTag1); 
    UILabel *noLabel = (UILabel*) [self.tableView viewWithTag:index+1+noCountLabelTag1]; // you get your label reference here 
    UIButton *noButton=(UIButton *)[self.tableView viewWithTag:index+noVoteButtonTag1]; 

Diese viewWithTag-Aufrufe sind null, wenn ich sie anschaue. Der einzige Unterschied, den ich aus meiner früheren Implementierung sehen kann, ist, dass der alte Abschnitt und eine Zeile hatte, während dieser eine Zeile und einen Abschnitt enthält. Daher sollte das Ersetzen von indexPath.section durch indexPath.row dies berücksichtigen. Außerdem habe ich überprüft, dass das in cellForRowAtIndexPath erstellte Tag dasselbe ist wie die in der Ja/Nein-Vote-Methode wiederhergestellte Zeile, da es wegen der bei indexPath.row == 0 erstellten Profilzelle um eins verschoben wird. Ich habe versucht, die Zelle an die Ja/Nein-Methode übergeben und versucht, die Schaltflächen und Beschriftungen mit ContentView als einige Vorschläge für ähnliche Beiträge wiederhergestellt. Dies schien jedoch mein Problem nicht zu lösen. Ich würde wirklich einen Einblick in diese Sache zu schätzen wissen.

Antwort

0

Haben Sie die Methode '[tableView reload]' aufgerufen, um UITableView zu aktualisieren, kann das hilfreich sein.

0

Erstens, die Tabelle Wiederverwendung Bezeichner sollte für Typen Zellen verwendet werden, nicht eine für jede Zelle. Sie haben zwei Arten, daher sollten Sie zwei feste Wiederverwendungskennungen verwenden.

ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"ProfileCell"]; 

if (cell == nil) { 
    cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:@"ProfileCell"]; 
} 

und

YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:@"YesNoCell"]; 
if (cell==nil) { 
    cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"YesNoCell"]; 
} 

Zweitens, anstatt einen Verweis auf eine Zelle zu erhalten versuchen, nach Erstellen der Tabelle, die nicht für Sie arbeiten, sollten Sie die Zellen vollständig initialisieren, wenn sie erstellt werden . (TableView erstellt keine Zellen, es sei denn, sie sind sichtbar, Sie sollten sich also nicht auf ihre vorhandenen verlassen.)

createProfileCell sollte wirklich initializeProfileCell genannt werden, weil Sie nicht die Zelle darin erstellen - Sie bereits tat das in der Zeile oben, oder erholte sich eine alte.

Dann kann Ihr Anruf an initializeProfileCell ein Flag übernehmen, das angibt, ob es sich um eine Ja- oder Nein-Zelle handelt, und seine Eigenschaften entsprechend einstellen.

cell = [self initializeProfileCell:cell isYes:(indexPath.section==0)]; 

Ähnlich ist es mit createYesNoCell ->initializeYesNoCell.

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"YOURCELL_IDENTIFIER"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    UILabel *title = (UILabel*) [cell viewWithTag:5]; 
    UILabel *vensu =(UILabel*) [cell viewWithTag:7]; 
    vensu.text = @"YOUR TEXT"; 

    title.text = @"YOUR TEXT"; 

    return cell; 
}