2016-03-22 10 views
0

Ich arbeite an einer App, wo ich ein TableView mit Benutzern gefüllt anzeigen möchte, und wenn die Zeile ausgewählt ist, wird eine neue Ansicht angezeigt, die eine Konversation (also im Grunde eine Messaging-App) enthält. Für den Moment möchte ich nur, dass wenn ich eine Zeile auf meinem FirstViewController berühre, der SecondViewController mit dem Namen des Benutzers angezeigt wird, der auf einem Etikett ausgewählt ist. Aber ich kann es nicht zum Laufen bringen, denn jedes Mal, wenn ich eine Zeile berühre, ist der IndexPfad 0, dh es ist immer der erste Benutzername, der angezeigt wird. Hier ist ein Teil meines Code:Übermittle Daten über das Segment auf TableView

#import "GSBChatViewController.h" 
#import "GSBConversationViewController.h" 



@interface GSBChatViewController() 
@property (weak, nonatomic) IBOutlet UITableView *userTableView; 

@end 

@implementation GSBChatViewController 
@synthesize chatUsers; 

- (void)viewDidLoad { 
[super viewDidLoad]; 

GSBChatUsers *user1 = [[GSBChatUsers alloc]initWithName:@" John DOE" andPicture:@"photo.jpg" andLastMessage:@"Ca marche!"]; 
GSBChatUsers *user2 = [[GSBChatUsers alloc]initWithName:@"Justine DUBOIS" andPicture:@"photo.jpg" andLastMessage:@"Salut, ça va?"]; 
GSBChatUsers *user3 = [[GSBChatUsers alloc]initWithName:@"Jacques LAPORTE" andPicture:@"photo.jpg" andLastMessage:@"Réunion le 23 à 15h, c'est bon pour toi?"]; 
GSBChatUsers *user4 = [[GSBChatUsers alloc]initWithName:@"Guillaume DUPOND" andPicture:@"photo.jpg" andLastMessage:@"OK, parfait"]; 
GSBChatUsers *user5 = [[GSBChatUsers alloc]initWithName:@"Françoise MARTIN" andPicture:@"photo.jpg" andLastMessage:@"Tu as posé tes congés?"]; 
GSBChatUsers *user6 = [[GSBChatUsers alloc]initWithName:@"Jean-Jacques CELESTIN" andPicture:@"photo.jpg" andLastMessage:@"Je prends note"]; 

chatUsers = [[NSArray alloc]initWithObjects:user1,user2,user3,user4,user5,user6, nil]; 

} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 



#pragma mark - Navigation 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

NSIndexPath *indexPath = [self.userTableView indexPathForCell:sender]; 
NSLog(@"Path: %@",indexPath); 

GSBConversationViewController *destVC = [segue destinationViewController]; 
GSBChatUsers *selectedUser =[chatUsers objectAtIndex:indexPath.row]; 

NSLog(@"%ld",[self.userTableView indexPathForCell:sender].row); 
NSString *userName = selectedUser.name; 

NSLog(userName); 
destVC.Test=userName; 

} 


#pragma mark - Datasource 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

// Retourne le nombre d'éléments de notre liste 
NSLog(@"Number of rows: %ld",chatUsers.count); 
return [chatUsers count]; 

} 

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

// Instancie notre cellule par son identifier 
GSBTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"userCell"]; 

// On récupère l'item que l'on va traiter 
GSBChatUsers *user = [chatUsers objectAtIndex:indexPath.row]; 

// On affecte les valeurs de notre user aux éléments de notre cellule 
[cell.userName setText:user.name]; 
[cell.profilePicture setImage:[UIImage imageNamed:user.picture]]; 
[cell.lastMessage setText:user.lastMessage]; 
NSLog(@"%@",chatUsers); 

return cell; 

} 




- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
NSLog(@"%@",_cellTitle); 
//[self performSegueWithIdentifier:@"conversationSegue" sender:[chatUsers objectAtIndex:indexPath.row]]; 

} 


@end 

ich this answer sah sowie this one aber keiner von ihnen geholfen. (Sie haben mir geholfen, weil ich vorher nicht einmal den Text des Etiketts ändern konnte).

Haftungsausschluss: Dies ist für ein Schulprojekt, und ich bin zu hundert Prozent erlaubt, um Hilfe im Internet zu fragen. Da Englisch nicht meine Muttersprache ist, bin ich in einigen Punkten nicht klar, bitte lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen.

Danke für Ihre Hilfe!

+0

so haben Sie den Übergang vom 'FirstViewController' zum' SecondViewController' per Drag & Drop in Storyboard verdrahtet? –

+0

@ AndréSlotta Ja, von der Prototyp-Zelle des erstenViewControllers zu dem zweiten ViewController – nommis

+0

gut in diesem Fall brauchen Sie nicht die 'didSelectRowMethod', sondern nur' PrepareForSegue'. und in prepareForSegue druckt es immer die Zeile ** 0 ** aus? –

Antwort

0

Es sieht so aus, als ob die Tabelle im Storyboard nicht mit der Steckdose verbunden ist userTableView. Daher gibt die Zeile NSIndexPath *indexPath = [self.userTableView indexPathForCell:sender]; nicht das richtige Ergebnis zurück.

Gehen Sie zu Ihrem Storyboard, verbinden Sie die Steckdose mit der Tabellenansicht und versuchen Sie es erneut!

outlet is not connected

+0

Danke, dass du dir die Zeit genommen hast, mir zu helfen! Ich habe es versucht und es funktioniert immer noch nicht. Ich muss jetzt schlafen gehen, also werde ich morgen alle Steckdosenanschlüsse überprüfen, denn wenn ich einen vergessen habe, gibt es Chancen, dass ich andere vergessen habe. BTW, wenn Sie es testen möchten, brauchen Sie kein Passwort, berühren Sie einfach das Logo auf der Login-Seite! Ich werde dich wissen lassen, wenn ich etwas finde, nochmals vielen Dank für deine Zeit! – nommis

+0

es funktioniert!Sie müssen ** die Steckdose ** des Tableview verbinden, wie ich es in meiner Lösung geschrieben habe, und Sie müssen auch ** den Abschnitt * einmal löschen und ** neu installieren **, indem Sie von der Zelle zum Zielansicht-Controller ziehen. voila! :) –

+0

Das ist großartig! Vielen dank für Deine Hilfe! Ich hätte nie daran gedacht, Steckdosen zu überprüfen, ich denke, ich werde jetzt darüber nachdenken! :) – nommis

0

Wenn Sie eine segue auf dem Storyboard aus dem Tabellenzelle Prototyp auf den View-Controller geschleppt Sie schieben wollen, dann sind Sie auf halbem Weg gibt. Der Übergang wird jedoch ausgelöst, bevor das UITableViewDelegate über den Benutzer "didSelectRowAtIndexPath" informiert wird, sodass die Navigation zum nächsten View-Controller erfolgt, bevor der Code in dieser Delegate-Methode ausgeführt wird.

Die Lösung besteht darin, prepareForSegue:sender: in Ihrem FirstViewController zu überschreiben. In diesem Fall ist der Absender die Tabellenzelle, die angezapft wurde.

Ihre Implementierung wie folgt aussehen könnte:

- (void)prepareForSegue:(UIStoryboardSegue *)segue 
      sender:(id)sender { 
    GSBTableViewCell *cell = (GSBTableViewCell *)sender; 
    SecondViewController *destination = ((SecondViewController *)segue.destinationViewController); 
    destination.view; // Sadly, this is required to force the outlets to be connected in the destination view controller before you try to access them 
    destination.userNameLabel.text = cell.userName.text; 
} 
Verwandte Themen