IOS 6 - могу ли я вернуть данные, когда я разматываю segue?

Я создал простой способ размотки, используя инструменты раскадровки. Я создал следующий обработчик событий в представлении, которое я хочу восстановить:

-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
    NSLog(@"SEGUE unwind");
}

Это срабатывает правильно и разматывает сеанс (сообщение регистрируется).

Когда пользователь выходит из викторины, я хотел бы передать некоторые данные назад и боролся с тем, как это сделать. Может ли кто-нибудь посоветовать?

Ответ 1

Спасибо Джеффу. После просмотра видео WWDC 407 У меня есть четкое решение.

В контроллере представления, который является целью размотки, вы должны создать метод, который принимает один параметр UIStoryboardSegue и возвращает IBAction. UIStoryboardSegue имеет метод возврата контроллера исходного вида! Вот пример, взятый из видео (кредит для Apple).

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}

Ответ 2

Получение данных из разворачиваемого сеанса очень хорошо объясняется в этом яблочном разговоре, вторая половина презентации (править: начинается с 37:20)

В частности, в режиме разговора [segue sourceViewController] - это все еще активный контроллер представлений, из которого возникло событие разматывания, поэтому просто обращайтесь к своим свойствам как обычно.

Ответ 3

Добавить функцию prepareForSeque в закрытом контроллере.

- (void) prepareForSegue:( UIStoryboardSegue *) segue отправитель: (id) отправитель

Эта функция называется до вызывается разматывание segue (в вашем примере вы назвали quitQuiz). Как вы можете видеть, у него также есть параметр отправитель, чтобы вы могли узнать, кто вызвал его, и соответствующим образом собрать соответствующие данные.

Например, видео WWDC 407, если вы нажали кнопку reset, вы не установили бы учетную запись и если бы вы нажали кнопку "Готово", вы бы.

Ответ 4

Настройте делегата и сообщите диспетчеру вашего источника о выходе из викторины и отправьте обратно данные. Не забудьте установить контроллер представления источника как делегата контроллера представления назначения.

// DestinationViewController.h
@protocol DestingationDelegate;
@interface 
...
@property (assign) id<DestinationDelegate> delegate;
...
@end

@protocol DestinationDelegate
-(void)didQuitQuiz:(NSDictionary*)infoDict;
@end

// DestinationViewController.m
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
  NSLog(@"SEGUE unwind");
  if (self.delegate) [self.delegate didQuitQuiz:infoDict];
}


// SourceViewController.h
#import DestinationViewController.h
@interface SourceViewController : ViewController <DestinationDelegate>
....

// SourceViewController.m
-(void)didQuitQuiz:(NSDictionary *)infoDict {
    if (infoDict) {
       // do something with the data
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   ...
   destinationViewController.delegate = self;
}

Ответ 5

Да,
Для этого вам нужно будет создать свойства, в которых ваши данные будут отправляться с другого контроллера представления:

    - (IBAction)unwindSelectFriendsVC:(UIStoryboardSegue *)segue
    {
        if ([segue.sourceViewController isKindOfClass:[ChildVC class]]) {

            ChildVC *child = (ChildVC *) segue.sourceViewController;

            //here we are passing array of selected friends by arrSelectedFriends property
            self.arrFriendList = child.arrSelectedFriends;
            [self.tableView reloadData];
        }
    }

Ответ 6

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

В заголовке контроллера просмотра викторины объявите аналогичное определение протокола:

@protocol JBQuizViewControllerDelegate <NSObject>

@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;

@end

В вашем методе представления представления prepareForSeque: подключите делегат:

JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;

Затем в вашем представлении контроллера представления обработайте метод делегата quizController:didQuitWithState:.

Наконец, как только пользователь завершит вашу викторину, вы должны уведомить делегата, используя протокол, передав состояние или любые другие данные, которые вы хотите просмотреть.