1

У меня есть два диспетчера viewControllers, которым нужна кнопка входа в верхний правый угол панели навигации.Не могу добраться до пользовательского праваBarButtonItem

В viewController1 # viewDidLoad, я создал rightBarButtonItem как так (сокращенно):

// set up the login button on the right 
UIButton *loginButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *loginImage = [UIImage imageNamed:@"btn_login.png"]; 
[loginButton setBackgroundImage:loginImage forState:UIControlStateNormal]; 
[loginButton setFrame:CGRectMake(0, 0, loginImage.size.width, loginImage.size.height)]; 
[loginButton setTag:1111111]; 
UIBarButtonItem *loginItem = [[UIBarButtonItem alloc] initWithCustomView:loginButton]; 
self.navigationItem.rightBarButtonItem = loginItem; 
[loginItem release]; 

пометить его так, чтобы в viewWillAppear, я могу использовать viewWithTag:1111111, чтобы выяснить, если это нужно скрыть или видимым , в зависимости от того, зарегистрирован ли пользователь. Простой.

((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true; 

Когда viewController2 получает в стек, я в основном запустить тот же код, чтобы настроить мой rightBarButtonItem, но я даю ему другой тег (то есть 222222).

In viewController2 # viewWillAppear, когда я ищу viewWithTag:222222, он возвращается как null, и поэтому я не могу скрыть/показать его.

Я заметил, что если я использую тот же тег, что и в viewController1 (1111111), я могу добраться до него.

Почему это? Мои теги фактически настроены в верхней части файла как константы, поэтому кажется, что нецелесообразно копировать случайное число из vc1 в vc2, чтобы я мог заставить это работать. Вместо этого я хотел бы понять, почему тег vc2 не применяется к rightBarButtonItem, и почему тег vc1 все еще сохраняется, хотя я в другом viewController.

+0

Мое первое предположение заключается в том, что вы добавили лишние или меньшие цифры в тег, когда вы назначаете «тег», и когда вы получаете представление из 'tag' – tipycalFlow

+0

Мое второе предположение (серьезное) заключается в том, что 222222 вызывает некоторое переполнение целого числа и превращает его в -123648 или что-то в этом роде. Попробуйте меньший тег, такой как 2222 – tipycalFlow

+0

Мои теги на самом деле 34590 для vc1 и 234355 для vc2. Я просто использовал 1111111 и 222222, чтобы прояснить этот вопрос, на который был показан viewController. – djibouti33

ответ

0

Самый простой наиболее масштабируемое решение, чтобы избежать использования viewWithTag: как чумы.

Сделайте UIBarButtonItem ivar, а затем у вас есть мгновенный доступ к нему без каких-либо двусмысленностей.

Заменить

[loginButton setTag:1111111]; 

с

self.loginButton = loginButton; 

Затем, чтобы получить это сделать

self.loginButton; 

вместо

(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG]; 

Я знаю, какой из них выглядит более изящным и надежным для меня

+0

Можете ли вы объяснить, почему 'viewWithTag:' так плохо? Я смотрел на это как на более элегантное решение, чем на то, чтобы создать экземпляр ivar для элементов, когда вам просто нужно «добраться до» этих элементов. – djibouti33

+0

Зачем искать по всей иерархии представлений, запрашивая каждое представление для своего тега, когда вы можете просто иметь указатель прямо на него? Вы также полагаетесь на переменную, которую легко изменить случайно. –

0

Если я правильно понимаю, что вы делаете, то первое, что я хотел бы попробовать, чтобы проверить, до этой линии, в обоих viewcontrollers:

((UIButton *)[self.navigationController.view viewWithTag:LOGIN_BUTTON_TAG]).hidden = true; 

поставить

NSLog("View is %@", self.navigationController.view); 

проверить если вы отправляете viewWithTag в правильное представление. Не уверен в этом, но пытаетесь ли вы получить доступ к контроллеру просмотра UIViewcontroller, загруженному внутри UINavigationcontroller? В этом случае я хотел бы использовать:

(UIButton *)[[[self.navigationController visibleViewController] view] viewWithTag:LOGIN_BUTTON_TAG]; 
+0

Когда я регистрирую self.navigationController.view в vc1 и vc2, я получаю тот же самый объект ( djibouti33

+0

Хорошо, это то, что я говорил :-) (извините, но мой английский не очень хорош). Со второго диспетчера представлений вы получаете доступ к представлению первого диспетчера представлений, и по этой причине вы можете видеть только представление с тегом 11111 :-). Попробуйте использовать (UIButton *) [[[self.navigationController visibleViewController] view] viewWithTag: LOGIN_BUTTON_TAG]; – LombaX

+0

Очевидно, что вы даже можете использовать ивар, как написано Павлом. В моем ответе я пытаюсь сосредоточиться на том, что является ошибкой в ​​вашем коде, но есть и другие способы :-) – LombaX