我正在开发一个应用程序,我想显示一个填充了用户的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,但没有一个帮助过。 (他们帮助了,因为事先我甚至无法改变标签的文字)。
免责声明:这是针对学校项目的,我百分之百允许在互联网上寻求帮助。 由于英语不是我的母语,我可能不清楚某些方面,如果您需要进一步的信息,请告诉我。
感谢您的帮助!
答案 0 :(得分:0)
看起来故事板中的tableView未连接到插座userTableView
。因此,行NSIndexPath *indexPath = [self.userTableView indexPathForCell:sender];
不会返回正确的结果。
转到您的故事板,将插座连接到tableview,然后重试!
答案 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;
}