Какие есть альтернативы «делегатам» для передачи данных между контроллерами? - PullRequest
1 голос
/ 04 апреля 2011

Существуют ли альтернативы "делегатам" для передачи данных от одного контроллера к другому?

Кажется, что очень много работы по реализации делегата просто для передачи результата от дочернего контроллера обратно к родительскому контроллеру. Разве нет другого метода? Являются ли "блоки" одним ответом, и если да, то какой-то пример кода был бы великолепен.

Ответы [ 6 ]

14 голосов
/ 04 апреля 2011

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

Пять строк кода в интерфейсе ребенка.До @interface:

@protocol MyUsefulDelegate <NSObject>
- (void)infoReturned:(id)objectReturned;
@end

Внутри @interface:

id <MyUsefulDelegate> muDelegate;

После @ inteface's @end:

@property (assign) id <MyUsefulDelegate> muDelegate;

Одна строка кода в реализации ребенка:

[[self muDelegate] infoReturned:yourReturnObject];

Одно дополнение к существующей строке кода в интерфейсе родителя:

@interface YourParentViewController : UIViewController <MyUsefulDelegate>

Три строки кода в реализации родителя.Где-то перед тем, как вызвать ребенка:

[childVC setMuDelegate:self];

В любом месте реализации:

- (void)infoReturned:(id)objectReturned {
    // Do something with the returned value here
}

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

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

7 голосов
/ 04 апреля 2011

Вы можете использовать много способов:

  1. Вызов метода суперконтроллера, может потребоваться приведение
  2. Уведомления
  3. Простой Наблюдение ключевых значений
  4. Базовые данные

Пример для для 1.

интерфейс вашего MainViewController: добавьте открытый метод для передаваемых данных

- (void)newDataArrivedWithString:(NSString *)aString;

MainViewController, показывающий ChildController

- (void)showChildController
{
    ChildController *childController = [[ChildController alloc] init];
    childController.mainViewController = self;

    [self presentModalViewController:childController animated:YES];

    [childController release];
}

Дочерний контроллер / интерфейс заголовка: добавьте свойство для mainViewController

@class MainViewController;

@interface ChildController : UIViewController {
    MainViewController *mainViewController;   
}

@property (nonatomic, retain) MainViewController *mainViewController;

Дочерний контроллер, передающий данные в MainViewController

- (void)passDataToMainViewController
{
    NSString * someDataToPass = @"foo!";
    [self.mainViewController newDataArrivedWithString:someDataToPass];
}
2 голосов
/ 04 апреля 2011

KVO или уведомления - это путь во многих случаях, но делегирование дает очень хорошую основу для дальнейшего развития. Если вы планируете расширить связь между контроллерами представления в будущем, рассмотрите возможность использования делегирования.

Блоки на самом деле не имеют отношения к вышесказанному, но вкратце - это методика, представленная в iOS 4, где вы передаете блоки кода в виде переменных / параметров. Это очень мощный и много применений. Например, вот как вы перечисляете объекты в массиве, используя блок:

[someArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
    NSLog(@"obj descriptions is - %@", [obj description]); 
}]; 

Часть от ^ до } является блоком. Обратите внимание, что я передал его в качестве параметра. Теперь этот блок кода будет выполняться для каждого объекта в массиве (т. Е. На выходе будет описание каждого объекта).

Блоки также очень эффективны в плане производительности и активно используются во многих новых инфраструктурах.

Apple руководство для начинающих по блокам довольно хорошо.

1 голос
/ 04 апреля 2011

Люди уделяют много внимания V и C в MVC, но часто забывают о M. Если у вас есть модель данных, вы можете передать ее с одного контроллера на другой. Когда один контроллер вносит изменения в данные, хранящиеся в модели, все остальные контроллеры, использующие одну и ту же модель, автоматически получат изменения.

1 голос
/ 04 апреля 2011

Оформить NSNotificationCenter - NSNotificationCenter Class Reference

0 голосов
/ 04 апреля 2011

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

Затем добавьте сохранение состояния вашего приложения;)

...