通过tableView上的segue传输数据

时间:2016-03-22 21:51:51

标签: ios objective-c iphone uitableview segue

我正在开发一个应用程序,我想显示一个填充了用户的tableView,当选择该行时,会显示一个包含对话的新视图(所以基本上是一个消息传递应用程序)。现在我只想要在我的FirstViewController上触摸一行时,将显示SecondViewController,其中包含在标签上选择的用户名。但是我不能让它工作,因为每次触摸一行时,indexPath都是0,因为它始终是显示的第一个用户名。这是我的代码的一部分:

#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

我查看了this answer以及this one,但没有一个帮助过。 (他们帮助了,因为事先我甚至无法改变标签的文字)。

免责声明:这是针对学校项目的,我百分之百允许在互联网上寻求帮助。 由于英语不是我的母语,我可能不清楚某些方面,如果您需要进一步的信息,请告诉我。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

看起来故事板中的tableView未连接到插座userTableView。因此,行NSIndexPath *indexPath = [self.userTableView indexPathForCell:sender];不会返回正确的结果。

转到您的故事板,将插座连接到tableview,然后重试!

outlet is not connected

答案 1 :(得分:0)

如果您将故事板上的segue从表格单元格原型拖动到要推送到的视图控制器,那么您就在那里。但是,在UITableViewDelegate被通知用户“didSelectRowAtIndexPath”之前将触发segue,因此在该委托方法中的代码运行之前,将导航到下一个视图控制器。

解决方案是覆盖FirstViewController中的prepareForSegue:sender:。在这种情况下,发件人将是被点击的表格单元格。

您的实施可能如下所示:

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