Вопрос по uistoryboardsegue, iphone, xcode, ios – prepareForSegue и popViewController совместимость

2
Вопрос я

я работаю надiOS приложение и у меня есть 3 подряд:ViewControllers

TableViewController -> DetailViewController -> ImageViewController

Я делаю вперед вперед Segue с помощью кнопки (Просто управляйте перетаскиванием наStoryboard) и для возврата у меня есть пользовательская кнопка назад с

[self.navigationController popViewControllerAnimated:YES];

Для отправки данных я использую

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [segue.destinationViewController someFunction];
}

Чтобы отправить данные родителюViewController я могу использоватьprepareForSegue вDetailViewController, но это не такработать вImageViewController и там я должен использовать.Notifications

Это'все в порядке, если я используюprepareForSegue отправить данные с?popViewControllerAnimated

Должен ли я использовать уведомления в обоих случаях?

Некоторый код

Что я имею вDetailViewController кнопка, которая выполняет переход к ImageViewController (просто перетащитеStoryboard) и кнопку «Назад» с:

- (IBAction)backAction:(id)sender {
     [self.navigationController popViewControllerAnimated:YES];
}

а затем функция:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"forwardSegue"]) {
        [segue.destinationViewController someFuntionToImageViewController];
    } else {
        [segue.destinationViewController someFuntionToParentViewController];
    }
}

Я заметил, что могуназначить segue.identifierpopViewController действие.

Ваш Ответ

1   ответ
11

представления, которые перемещаются по сегментам:

Для передачи данных вперед:

Вы объявляете свойство в целевом vc и устанавливаете его значение вprepareForSegue метод. (Так, как ты это сделал)

@interface SomeViewController

@property (strong, nonatomic) VeryImportantData *data;
//...
@end

@implementation SourceVC

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    VeryImportantData *theData = ...;
    segue.destinationViewController.data = theData;
}

Передать данные обратно

Вы объявляете протокол делегата. Это может выглядеть так:

@protocol SomeViewControllerDelegate
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data;
@end

Ваш целевой vc предоставляет делегатское свойство:

@property (weak, nonatomic) id<someviewcontrollerdelegate> delegate;
</someviewcontrollerdelegate>

Назначение VC называет этоМетод делегатов, как только этоготов к закрытию:

@implementation SomeViewController

- (void) close
{
    [delegate someViewController:self didFinishWithData:self.data];
}

И ваш контроллер источника реализует протокол и устанавливает себя в качестве делегата назначения vc вprepareForSegue метод.

@implementation SourceVC

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


//...
- (void)someViewController:(SomeViewController *) someVC didFinishWithData:(SomeData *) data
{
    self.receivedData = data;
    [self.navigationController popViewControllerAnimated:YES];
}
Большое спасибо. Я'не используется с делегированием ... Где я должен написать протокол?Редактировать: Хорошо, извините, я только что прочитал это. Octan
Возможно, стоит прочитатьШаблоны дизайна какао много's отличной информации о шаблонах проектирования, включая делегирование Tobi

Похожие вопросы