2013-04-13 3 views
0

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

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

- (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

Прежде чем инициализировать? в чем именно проблема?: – rdelmar

ответ

0

Ваша проблема в том, что до тех пор, пока вы фактически не перейдете на вкладку 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 s, или свойство в вашем appDelegate ... всего лишь несколько из множества возможных решений.

+0

Вау, это помогает. Теперь просто нужно пример того, как это сделать. Я все выясню. – tjberte

+0

Итак, я добавил это на свою первую вкладку. ClientViewController * vc2 = [self.tabBarController.viewControllers objectAtIndex: 1]; self.delegate = vc2; ------- Тот же вопрос. Кроме того, я поместил его в «awakeFromNib», потому что я использую Storyboard. Такая же проблема. Не знаете, как использовать initWithCoder. – tjberte

+0

@tjberte Забудьте делегатов, теперь они вам не нужны, они просто вас спугнут. уже имеют ссылки на каждый viewController через массив 'tabBarController.viewControllers'. Ваш вопрос недостаточно ясен, чтобы помочь намного дальше. Я предлагаю вам работать с советами, которые вам даны здесь, а затем, если вы застряли, отредактируйте это вопрос, который точно описывает то, что вы пытаетесь сделать, какие данные вы собираетесь пройти, и где вы застряли. Не обращайтесь к этому учебнику, просто опишите _your_ task и _your_ (нерабочее) решение, показывая код _your_. – foundry