Сбой в пользовательском представлении как UINavigationControllers navigationItem.titleView - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть UIViewController с несколькими подпредставлениями в свойстве view (UISearchbar и несколько UIButton s). UIButton s подключены к типичным IBAction s, как -(IBAction)buttonPressed:(id)sender для состояния UIControlEventTouchUpInside - не имеет значения, делаю ли я это в IB или программно.

- (void)viewDidLoad {
    MUZTitleViewController *title = [[MUZTitleViewController alloc] 
                                     initWithNibName:nil bundle:nil];
    self.navigationItem.titleView = title.view;
}

В моем проекте также есть UINavigationController. Когда я устанавливаю navigationItem.titleView из UINavigationBar на вид моего UIViewController вида, я получаю исключение EXC_BAD_ACCESS, как только я нажимаю одну из кнопок. Я не знаю, почему это так.

Я загрузил небольшой пример проекта, чтобы проиллюстрировать свою проблему: Test010.xcodeproj (включен ARC)

Все больше и больше я прихожу к выводу, что не стоит использовать вид UIViewController и присваивать его titleView, но я не вижу здесь альтернативы.

Редактировать: Извините, пример проекта закомментировал вызов, который вызывает исключение. Я заново загрузил связанный файл проекта.

Редактировать ^ 2: Как указал PengOne, я пропустил точное сообщение об ошибке, которое я получил:

2011-09-10 23:09:50.621 Test010[78639:f803] -[CALayer buttonPressed:]: unrecognized selector sent to instance 0x9254ae0
2011-09-10 23:09:50.623 Test010[78639:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer buttonPressed:]: unrecognized selector sent to instance 0x9254ae0'

Ответы [ 2 ]

3 голосов
/ 11 сентября 2011

Вы пытались установить NSZombieEnabled на ДА? Если я сделаю это, консоль отобразит следующий вывод:

2011-09-10 22:56:23.329 Test010[6481:ef03] *** -[MUZTitleViewController
performSelector:withObject:withObject:]: message sent to deallocated 
instance 0x7a7ff70

Поскольку в проекте включена поддержка ARC, контроллер, кажется, освобождается через некоторое время после этой строки:

MUZTitleViewController *title = [[MUZTitleViewController alloc] initWithNibName:nil bundle:nil];

Я не уверен, что является лучшим решением, но свойство определенно помогает предотвратить исключение, например:

// MUZDetailViewController.h
@property (strong, nonatomic) MUZTitleViewController *title;

// MUZDetailViewController.m
@synthesize title;

self.title = [[MUZTitleViewController alloc] initWithNibName:nil bundle:nil];
self.navigationItem.titleView = title.view;
1 голос
/ 16 октября 2011

Проблема, с которой вы столкнулись в ARC, также может быть решена путем установки контроллера начального вида вашего приложения в качестве свойства rootViewController главного окна вместо использования addSubview.

Это позволяет избежать добавления каждого пользовательского контроллера представления в качестве свойства.

...