2016-03-22 4 views
0

Я работаю над приложением, где я хочу отображать таблицуView, заполненную пользователями, а когда выбрана строка, отображается новое представление, содержащее беседу (так, в основном, приложение для обмена сообщениями). На данный момент я просто хочу, чтобы, когда я касался строки на моем FirstViewController, SecondViewController отображается с именем пользователя, выбранного на ярлыке. Но я не могу заставить его работать, потому что каждый раз, когда я касаюсь строки, indexPath равно 0, si это всегда первое имя пользователя, которое отображается. Вот часть моего кода:Передача данных через segue на 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 

Я смотрел на this answer, а также this one, но ни один из них не помог. (Ну, они помогли, потому что заранее я даже не мог изменить текст ярлыка).

Отказ от ответственности: Это касается школьного проекта, и я на сто процентов разрешаю обратиться за помощью в Интернет. Поскольку английский не мой родной язык, может быть, я не понимаю некоторых моментов, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Благодарим за помощь!

+0

так вы проводной вверх SEGUE от 'FirstViewController' к' SecondViewController' с помощью перетаскивания и падения в раскадровке? –

+0

@ AndréSlotta Да, из ячейки прототипа firstViewController на secondViewController – nommis

+0

ну в этом случае вам не нужен 'didSelectRowMethod', а просто' prepareForSegue'. и в 'prepareForSegue' он всегда печатает строку ** 0 ** прямо сейчас? –

ответ

0

похоже, что таблицаView в раскадровке не подключена к розетке userTableView. поэтому строка NSIndexPath *indexPath = [self.userTableView indexPathForCell:sender]; не вернет правильный результат.

перейдите в свою раскадровку, подключите розетку к столу и попробуйте еще раз!

outlet is not connected

+0

Спасибо, что нашли время, чтобы помочь мне! Я пробовал это, и он все еще не работает. Я должен идти спать сейчас, поэтому завтра я буду проверять все соединения, потому что, если я его забуду, есть вероятность, что я забуду других. BTW, если вы хотите протестировать его, вам не нужен пароль, просто коснитесь логотипа на странице входа! Я дам вам знать, если я найду что-то, еще раз спасибо за ваше время! – nommis

+0

он работает!вы должны ** подключить выход tableview **, как я написал в своем решении, и вам также необходимо ** удалить segue ** один раз и ** переустановить его **, перетащив его из ячейки в контроллер viewviewcontroller. вуаля! :) –

+0

Отлично! Большое спасибо за вашу помощь! Я бы никогда не подумал о проверке торговых точек, думаю, я подумаю об этом сейчас! :) – nommis

0

Если вы вытащили SEGUE на раскадровке с вашего прототипа ячейки таблицы контроллера представления вы хотите, чтобы нажать на, то вы на полпути. Тем не менее, segue будет запущен до того, как UITableViewDelegate будет проинформирован о том, что пользователь «didSelectRowAtIndexPath», поэтому переход к следующему контроллеру представления произойдет до того, как ваш код будет запущен в этом делетете.

Решение должно переопределить prepareForSegue:sender: в вашем FirstViewController. В этом случае отправителем будет ячейка таблицы, которая была прослушена.

Вашей реализация может выглядеть следующим образом:

- (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; 
} 
Смежные вопросы