2012-05-06 2 views
2

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

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

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

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

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

ответ

0

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

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

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

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

1

prepareForSegue:sender: является предпочтительным способом передачи данных с одного контроллера вида на другой при использовании раскадровки. Смотрите Storyboard session from last year's WWDC; вы увидите, что Apple рекомендует этот метод.

Чтобы повторить то, что сказал sobri, просмотр кода контроллера обычно содержит «бизнес-логику» ваших приложений и, как правило, является наименее многоразовым кодом в вашем приложении. На момент написания этой статьи у меня было 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 «s setValuesForKeysWithDictionary:. Я бы просто использовал multiple setValue:forKey: звонки, сам