Передача данных между двумя контроллерами с использованием раскадровки

Я пытаюсь передать данные из одного UITableViewController в другой. Это мой код в контроллере начального представления:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Subject *subject = (Subject *)[self.fetchedResultsController objectAtIndexPath:indexPath]; [self showList:subject animated:YES]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } - (void)showList:(Subject *)subject animated:(BOOL)animated { ListsViewController *lists = [[ListsViewController alloc] initWithStyle:UITableViewStyleGrouped]; lists.subject = subject; NSLog(@"%@", lists.subject); [self performSegueWithIdentifier:@"showDetail" sender:self]; } 

Выход журнала показывал, что данные, которые я хотел, были переданы. Однако, когда я выполняю segue и регистрирую subject в ListsViewController , отображается значение null.

Есть идеи?

4 Solutions collect form web for “Передача данных между двумя контроллерами с использованием раскадровки”

Вам необходимо перезаписать prepareForSegue:sender: Быстрое исправление будет

 - (void)showList:(Subject *)subject animated:(BOOL)animated { [self performSegueWithIdentifier:@"showDetail" sender:subject]; } 

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil; controller.subject = ([sender isKindOfClass:[Subject class]]) ? subject : nil; } } 

Причина, по которой ваш код не работал, заключается в том, что в вашем showList:animated: методе вы создали экземпляр ListsViewController и назначили ему subject , но этот контроллер представления никогда не был представлен. Вместо performSegueWithIdentifier:sender создает другой экземпляр класса ListsViewController который ничего не знает о вашем subject . Вот почему вам нужно дождаться, когда UIStoryboardSegue создаст экземпляр контроллера точки назначения из раскадровки, а затем настроит его так, как вы хотите, что вы можете сделать в prepareForSegue:sender:

Также может быть не лучшим образом использовать subject в качестве отправителя в performSegueWithIdentifier:sender , потому что это просто не отправитель :). То, что я хотел бы сделать, – создать объект свойства в классе контроллера вида и использовать его prepareForSegue:sender:

 @interface MyViewController () @property (strong, nonatomic) Subject *subject; @end @implementation MyViewController - (void)showList:(Subject *)subject animated:(BOOL)animated { self.subject = subject; [self performSegueWithIdentifier:@"showDetail" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil; controller.subject = self.subject; } } ... @end 

Внедрить prepareForSegue и дату передачи в этом метосе

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([seque.identifier isEqualToString:@"showDetail"]) { ListsViewController *lists = seque.destinationViewController; lists.subject = subject; } } 

Это хорошо, но теперь вам нужно добавить это:

Сначала вместо:

 [self performSegueWithIdentifier:@"showDetail" sender:self]; 

Вам необходимо отправить объект:

 [self performSegueWithIdentifier:@"showDetail" sender:subject]; 

Добавьте свойство в свой список ListViewController.h:

 @property (nonatomic, strong) Subject * subjectSegue; 

И теперь в вашем первом представлении контроллер:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController * lists = (ListsViewController *)[segue destinationViewController]; lists.subjectSegue = sender; } 

Вам нужно понять, что performSegueWithIdentifier:sender: создает новый экземпляр контроллера вида. Таким ListsViewController , созданный вами ListsViewController не отображается на экране.

Вам нужно переопределить `prepareForSegue: отправитель:

 - (void)showList:(Subject *)subject animated:(BOOL)animated { [self performSegueWithIdentifier:@"showDetail" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = (ListsViewController *)segue.destinationViewController; controller.subject = self.subject; } 
  • Вставить segue - динамически переключать начальный UIViewController и содержащий UIViewController динамически
  • Как отменить сеанс, связанный с UIButton
  • кнопка-крана вызывает сбои приложения на боковой панели
  • Передача объектов Core Data в другой контроллер представления при выборе строки из UITableView
  • Является ли prepareForSegue правильным способом передачи значения между контроллерами представления
  • множественные переходы к одному и тому же контроллеру представления
  • В iOS выполняется ли создание экземпляра нового контроллера, который будет использоваться? Или он уже создан?
  • Как я могу перейти на вторую вкладку контроллера панели вкладок с первой вкладки?
  • Swift: Segue (модальный) для UITableViewController, который встроен в контроллер навигации antoher
  • iOS Swift передаёт переменные между viewControllers, используя Segue
  • В Swift 2 нет кнопки «Назад»
  • Interesting Posts

    Как отправить строку со специальным символом и тайским языком, используя синтаксический анализ XML в объекте c

    Если iOS – это 32-разрядная ОС, как мы можем использовать uint64_t и int64_t?

    Фоновая задача при получении apns

    Быстрая проблема с заголовком в Xcode 8 beta 6

    Как обрезать UIImage, не теряя при этом свойство масштаба?

    Amazon Cognito set identityId с использованием аутентификации разработчика Obj C

    UIKeyboardWillShowNotification

    Изменить размер рамки для 3D-модели

    Как добавить изображение в UIBarButtonItem?

    Как я могу изменить порядок элементов UINavigationController программно?

    authenticateWithCompletionHandler: устарел: сначала устарел в iOS 6.0

    iOS – Facebook SDK v3.11.1 – изменить идентификатор приложения по умолчанию

    Siesta Swift Кастинг из ImplicitlyUnwrappedOptional <Swift.AnyObject> в массив <AnyObject>

    Стиль UIView по умолчанию имеет закругленные углы?

    IOS Игнорирует ModalPresentationStyle и ModalTransitionStyle и представляет полноэкранный режим

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.