Цель c didSelectRowIndexPath — Передача данных другому контроллеру представления

#objective-c #uitableview #uiviewcontroller

#цель-c #uitableview #uiviewcontroller

Вопрос:

Привет, я пытаюсь передать данные из моего TableViewController_My_boards в ViewController_Update_Boards, но я не уверен, как это сделать, Поэтому прежде всего я создаю словарь с данными из firestore

 - (void)viewDidLoad {  [super viewDidLoad];    // Uncomment the following line to preserve selection between presentations.  // self.clearsSelectionOnViewWillAppear = NO;    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.  // self.navigationItem.rightBarButtonItem = self.editButtonItem;  _db = [FIRFirestore firestore];    objNSDictinoaryListOfBoards =[[NSMutableDictionary alloc]initWithCapacity:5];  [[self.db collectionWithPath:@"boards"]  getDocumentsWithCompletion:^(FIRQuerySnapshot * _Nullable snapshot,  NSError * _Nullable error) {  if (error != nil) {  NSLog(@"Error getting documents: %@", error);  } else {  for (FIRDocumentSnapshot *document in snapshot.documents) {  NSString *key = document.documentID;  NSDictionary *boardDetails = document.data;  [self-gt;objNSDictinoaryListOfBoards setObject:boardDetails forKey:key];    //NSLog(@"%@ =gt; %@", document.documentID, document.data);   }  NSLog(@"self-gt;objNSDictionaryListOfBoards= %@", self-gt;objNSDictinoaryListOfBoards);  [self.tableView reloadData];   }  }];}  

После этого я отобразил имя каждого элемента в ячейках представления таблицы

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SimpleIdentifier1" forIndexPath:indexPath];    // Configure the cell...  NSString *boardNo =[objNSDictinoaryListOfBoards allKeys][indexPath.row];  NSString *boardName =objNSDictinoaryListOfBoards [boardNo][@"name"];   cell.textLabel.text=boardName;  return cell; }  

И затем я хочу передать данные следующему контроллеру просмотра, когда я нажму на ячейку с didSelectRowIndexPath Это то, что у меня есть, но я потерял отсюда.

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{  UIStoryboard *sb=[UIStoryboard storyboardWithName:@"Main" bundle:nil];  UIViewController *vc=[sb instantiateViewControllerWithIdentifier:@"ViewController_Update_Boards"];  vc.modalTransitionStyle= UIModalTransitionStyleFlipHorizontal;  //[self presentViewController:vc animated:YES completion:NULL];  [self.navigationController pushViewController:vc animated:TRUE]; }  

Заранее спасибо

Комментарии:

1. UIViewController *vc=[sb instantiateViewControllerWithIdentifier:@"ViewController_Update_Boards"]; , вот vc , ты ведь знаешь его класс, верно? Так что бросьте его: MyViewController *vc = (MyViewController *)[sb instatiante...]; У вас есть indexPath в этом методе, вы знаете , как получить boardNo и затем vc.boardNo = boardNo , или любое другое свойство, которое вы хотите. [objNSDictinoaryListOfBoards allKeys] Так вот, здесь заказ не гарантирован. Вы должны использовать NSArray вместо NSDictionary для вашего источника данных.

2. спасибо, что так быстро ответили. Я не понимаю, как мне это сделать, я довольно новичок в objective c. Я не уверен, как получить плату.

3. @Juan : так же, как и в cellForRow

4. @Ptit Xav спасибо, я пытаюсь так, но я получаю свойство»Имя платы», не найденное в объекте типа»UIViewController*». — (void)TableView:(UITableView *)TableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ UIStoryboard *sb=[Раскадровка UIStoryboard с именем:@»Основной» пакет:ноль]; UIViewController *vc = (UIViewController *)[sb instantiateViewControllerWithIdentifier:@ «ViewController_Update_Boards»]; NSString *boardNo =[Все ключи objNSDictinoaryListOfBoards][indexPath.строка]; NSString *boardName =objNSDictinoaryListOfBoards [boardNo] [@»имя»]; vc.boardName=имя доски;

5. Вам нужно перевести возврат vac из раскадровки в правильный класс контроллера представления (тот, который вы определили с помощью необходимого интерфейса).

Ответ №1:

Предположим , что для пользовательского класса контроллера представления в вашей раскадровке установлено значение ViewController_Update_Boards , и у вас есть файл заголовка для этого контроллера, который выглядит примерно так:

 @interface ViewController_Update_Boards: UIViewController  @property (strong, nonatomic) NSString *boardName;  @end  

Убедитесь, что в вашем TableViewController_My_boards классе это самое главное:

 #import "ViewController_Update_Boards"  

затем измените свой didSelectRowAtIndexPath метод на этот:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];  ViewController_Update_Boards *vc = (ViewController_Update_Boards *)[sb instantiateViewControllerWithIdentifier:@"ViewController_Update_Boards"];  NSString *boardNo =[objNSDictinoaryListOfBoards allKeys][indexPath.row];  vc.boardName = objNSDictinoaryListOfBoards[boardNo][@"name"];  [self.navigationController pushViewController:vc animated:TRUE];  }  

Комментарии:

1. Выполнение этих шагов теперь работает идеально. Отличное объяснение, я все понял, я ценю это.