Лучший способ передачи данных между ViewController с переходами

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

Общий подход не так хорош, ИМХО: исходный ViewController может получить ссылку на целевой ViewController, чтобы он мог установить некоторые свойства в целевом ViewController. Но тот факт, что исходный ViewController знает какую-то часть целевого ViewController, неизбежно уменьшает развязку между объектами.

Мне интересно, возможен ли более общий подход, подобный этому:

  • исходный ViewController выполняет переход и упаковывает NSDictionary, содержащий данные, которые он хочет отправить (как это делают NSNotifications), без каких-либо сведений о конкретных свойствах целевого ViewController.
  • целевой ViewController может получить доступ к NSDictionary и заполнить свои собственные структуры данных.

Кто-нибудь знает, возможно ли это?


person MarcoSciamanna    schedule 06.05.2012    source источник


Ответы (2)


prepareForSegue:sender: — это предпочтительный способ передачи данных от одного контроллера представления к другому при использовании раскадровки. Посмотрите раскадровку прошлогодней конференции WWDC; вы увидите, что Apple также рекомендует этот метод.

Чтобы повторить то, что сказал Собри, код контроллера представления обычно содержит «бизнес-логику» ваших приложений и, следовательно, обычно является наименее пригодным для повторного использования кодом в вашем приложении. На момент написания этой статьи у меня было 7 приложений в магазине приложений, и я ни разу не использовал повторно какой-либо значительный фрагмент кода контроллера представления.

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

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if( [[segue identifier] isEqualToString:@"showLog"] ) {
        UIViewController* logView = segue.destinationViewController;
        if( [logView respondsToSelector:@selector(setManagedObjectContext:)] ) {
            [logView setValue:self.managedObjectContext forKey:@"managedObjectContext"];
        }
    }
}

Вы можете сделать что-то подобное со словарем, используя NSKeyValueCoding setValuesForKeysWithDictionary:. Я бы, наверное, просто использовал multiple setValue:forKey: звонки, сам

person zpasternack    schedule 19.08.2012

Это мнение, но я считаю, что контроллеры представления не соответствуют чистоте объектной ориентации.

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

Сильно связанные контроллеры представления делают код менее сложным. Разделение классов — это рекомендация, направленная на снижение сложности кода. Если ваше разъединение приводит к увеличению сложности, то это противоречит цели руководства.

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

person sobri    schedule 09.08.2012