iOS 6 - могу ли я вернуть данные, когда раскручиваю переход?

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

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

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

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

 Benjohn31 дек. 2014 г., 17:09
Это работает и все, но это 'Обидно, что единственный механизм для обработчика раскрутки (пункт назначенияUIViewController) забрать информацию у инициатора раскрутки через общедоступный интерфейсUIViewController это разматывается из. Было бы хорошо, еслиUIStoryboardSegue также предоставил способ узнатьsender это начало раскручивать. Я думаю, что во многих случаях это может быть лучшим способом предоставления информации обработчику раскрутки.
 dan03 дек. 2012 г., 05:22
Привет, ты решил это? Я тоже ищу решение. Тд
 Voicu26 мар. 2013 г., 07:41
Джефф'ответявляется решение.YourViewController *yourVC = [segue sourceViewController]; внутри вашего метода раскрутки, а затем вы можете получить доступ к своим выходам / полям на этом объекте VC.

Ответы на вопрос(6)

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

// 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;
}
</destinationdelegate></destinationdelegate>
 Jeff26 окт. 2012 г., 18:03
Протоколы - это здорово, но iOS6 значительно облегчает жизнь благодаря размотке сегментов, о чем спрашивает автор.

том яблочном выступлении, вторая половинапрезентация (редактировать: начинается с 37:20)

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

Да,

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

    - (IBAction)unwindSelectFriendsVC:(UIStoryboardSegue *)segue
    {
        if ([segue.
            ChildVC *child = (ChildVC *) segue.sourceViewController;

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

WWDC видео 407 У меня есть четкое решение.

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

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}
 Oz Solomon14 янв. 2016 г., 22:33
Для справки вот ссылка на вышеупомянутое видео WWDC. Соответствующая часть начинается примерно через 37 минут:developer.apple.com/videos/play/wwdc2012-407
 fullMoon17 мар. 2015 г., 15:04
Хороший код, просто для пояснения: ConfirmationViewController - это контроллер представления, от которого мы не извлечены, и этот метод существует в контроллере представления, к которому мы хотим развернуться.

- (Недействительными)prepareForSegue: (UIStoryboardSegue *) segue sender: (id)отправитель

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

Например, видео WWDC 407, если вы нажмете кнопку сброса, вы быне установите accountInfo, и если вы нажмете кнопку «Готово», вы бы сделали.

использованием протоколов. Вот'Вот пример:

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

@protocol JBQuizViewControllerDelegate <nsobject>

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

@end
</nsobject>

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

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

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

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

Ваш ответ на вопрос