#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. Выполнение этих шагов теперь работает идеально. Отличное объяснение, я все понял, я ценю это.