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

Я пытаюсь передать данные из одного 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; } 
  • Программно вернуться к предыдущему ViewController в Swift
  • Как я могу перейти на вторую вкладку контроллера панели вкладок с первой вкладки?
  • Встраивать контроллеры представления назначения Segue исключаются из восстановления пользовательского интерфейса
  • Выполнение Segue, вызванное UITableViewCell
  • CATransition для анимации segue (стиль до iOS 7)
  • iOS - Изменение контроллера корневого представления с анимацией
  • Создайте segue и прикрепите его между двумя контроллерами представлений через Swift?
  • Objective C IOS prepareForSegue, как мне получить переменную int, которую я назначил кнопке, чтобы перейти к следующему контроллеру View
  • prepareForSegue не устанавливает UILabel
  • iOS и xcode: как дать segue «идентификатор раскадровки», чтобы я мог программно манипулировать им
  • Swift segue не работает?
  • IOS StoryBoard несколько Segue из TableCell
  • Interesting Posts

    Почему Apple Push Notification Authentication Key (песочница и производство) не появляется

    Swift – должен вызвать назначенный инициализатор ошибки суперкласса SKSpriteNode

    Приложение для часов: завершено из-за ошибки памяти

    Показать вопрос о выпуске онлайн-сообществ с помощью ios xmpp Framework

    как рисовать не прямоугольник uitextview?

    iPad выделен серым цветом в целевом выборе инструментов

    Совместное использование того же UIViewController как rootViewController с двумя UINavigationControllers

    Как это сделать, чтобы мне не нужно было #import <CoreData / CoreData.h> во всех моих классах?

    Возврат даты из строки

    pod "Google / SignIn" против pod "GoogleSignIn"

    Использование календаря в моем приложении для отслеживания моих событий и синхронизации на календаре Google

    Телефонный разрыв с JQuery Mobile не откроет внутренние ссылки

    IOS: AOT раньше времени, что это?

    Как настроить уведомление Apple push для распространения

    Ионная сборка для iOS – проблемы с версией на основе ионного ядра / ядра

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