Указание делегата перед ViewDidLoad во вкладках

Итак, я следовал этому руководству: http://enroyed.com/ios/how-to-pass-data-between-ios-tab-bars-using-delegate/

И самая важная часть урока:

- (void)viewDidLoad
{
[super viewDidLoad];
   SecondViewController *svc = [self.tabBarController.viewControllers objectAtIndex:1];
svc.delegate = self; //important !! otherwise delegation will not work !
}

Проблема в том, что даже если я помещаю его в "viewWillLoad", он все равно заставляет меня щелкнуть вкладку, прежде чем она инициализируется. Как я могу указать это, прежде чем нажать на вкладку?

редактировать

У меня есть проект с тремя вкладками. Я использовал этот учебник при передаче данных от вкладки 1 к вкладке 2. Передаваемые данные - это URL-адрес веб-просмотра на вкладке 1 к URL-адресу на вкладке 2. URL-адрес проходит, когда я щелкаю ссылку на 1-й вкладке.

Данные действительно передаются, но только если я сначала физически нажимаю на 2-ю вкладку, а затем возвращаюсь на 1-ю и нажимаю на ссылку.

Таким образом, мне кажется, что мой код выше работает, только если я физически нажимаю на 2-й вкладке.

1 ответ

Ваша проблема в том, что - пока вы на самом деле не перейдете к пункту 2 вкладки, secondViewController инициализирован не полностью, поэтому нет данных для передачи из vc2 в vc1. Особенно, secondViewControllerПредставление еще не загружено, поэтому у его ползунка пока нет значения, и ползунка нет, поэтому нет и метода IBAction для вызова метода делегата. Действительно, так как передача данных запускается только при перемещении ползунка в VC2, должно быть совершенно очевидно, что пока вы не перейдете к vc2 и не переместите ползунок, ничего не произойдет.

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

Вы не предложили достаточно подробностей в своем вопросе о том, чего вы хотите достичь, но вы должны учитывать это:

Когда tabBarController загружается, все его дочерние viewControllers инициализируются, но их представления не загружаются.

Это означает, что эти методы вызывают:

//if loading from a xib or in code
- (id) initWithNibName:bundle

//if loading from a storyboard
- (id) initWithCoder:
- (void) awakeFromNib

Но вид загрузки методов (viewDidLoad, viewWillAppear и т. д.) не вызывается, так как представление не загружается, если вы не откроете соответствующую вкладку.

Вы можете решить эту проблему, поместив инициализированную переменную в ваш viewController2 (в одном из init методы) и доступ к этой переменной через синтаксис свойства из vc1. Но тогда вы можете просто поместить инициализированное значение непосредственно в vc1. Вам нужно внимательно подумать о том, как каждый vc зависит от другого, как вы можете отделить эту зависимость и, возможно, как настроить независимый источник данных, к которому оба vcs могут обращаться по мере необходимости. Это может быть модельный класс или NSUserDefaultс, или недвижимость в вашем appDelegate... только некоторые из многих возможных решений.

Другие вопросы по тегам