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:
.
Наконец, как только пользователь завершит вашу викторину, вы должны уведомить делегата, используя протокол, передав состояние или любые другие данные, которые вы хотите просмотреть.