0

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

Предположим, у вас есть MainView, который отображает данные из изменяемого массива через Bindings и возможность добавления нового элемента в этот массив. Теперь данные, добавленные в массив, могут быть более сложными и могут даже потребовать проверки, прежде чем его можно будет добавить в массив, или может быть создан объект моего класса данных. Таким образом, я добавил новый MVC или более конкретную пару VC в мой проект, который представляет собой представление, где все данные могут быть введены, и кнопку для ее сохранения. Действие клика на кнопке сохранения приведет к запуску проверки и затем, в конце концов, добавит данные в массив, если проверка прошла успешно.

Мне интересно, какое решение является лучшим решением для доступа к массиву из AddViewController. Общий измененный массив? Установка свойства в AddViewController?

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

+0

возможно дубликат [Передача данных между контроллерами View] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Rob

ответ

1

Delegate concept - ответ на все ваши проблемы!

После проверки данных успешно передать данные в контроллер MainView будут добавлены в массив :)

Детали: Ваш AddViewController должен иметь протокол и передать имущество

@protocol AddViewControllerDelegate <NSObject> 

-(void)addViewController:(AddViewController*)addViewController didCompleteWith:(id)data; 

@end 

@interface AddViewController : SuperClass 

@property (nonatomic,weak)id<AddViewControllerDelegate>delegate; 
... 

@end 

Ваших главным view controller должен реализовать этот протокол и настроить его как делегата AddViewController.

После проверки данных AddViewController должен вызывать метод протокола, определенный для делегата.

-(void)dataValid:(id)data { 
... 
[self.delegate addViewController:self didCompleteWith:data] 
... 
} 
+1

+1 Согласен. Но я мог бы предложить (а), что «делегат» должен быть «слабым» свойством; и (b) вместо имени метода addData, я мог бы рассмотреть его после 'ABNewPersonViewControllerDelegate' и вызвать этот метод' didCompleteWithNewXxx' (где «Xxx» - тип добавляемого объекта) и, очевидно, более значимый класс и имена протоколов, например 'AddXxxViewController' и' AddXxxViewControllerDelegate'. – Rob

+0

Хорошо, я плохо себя чувствую. Также понравилось ваше предложение по названию метода :) –

+0

Я также одобряю соглашения об именах @Rob. Я полностью имею чистое имя и хороший структурированный код. Спасибо за вашу помощь! – florianrogner

Смежные вопросы