iPad UISplitView Detail Toolbar NULL при запуске

Я ломал голову, пытаясь найти небольшую ошибку в iPad-части приложения, над которым я работаю. Это связано с проблемой в этом посте:

Странное поведение iPad SplitViewController

На самом деле, я должен сказать, что это точно такая же проблема. Однако единственное указанное там решение не сработает для меня, поскольку в моем приложении есть главное меню, которое переключается на представление моего UISplitViewController при нажатии соответствующей кнопки. Контроллер и содержащиеся в нем контроллеры представления не создаются до тех пор, пока не будет нажата кнопка. Таким образом, я не могу установить делегат контроллера перед вызовом [window makeKeyAndVisible], так как это было сделано еще при загрузке моего главного меню.

Теперь я добавил несколько вызовов NSLog в функцию willHideViewController делегата следующим образом:

NSLog(@"Will hide popover view controller!");
NSLog(@"self=%p",self);
NSLog(@"%@",detailPad.tbToolbar);

Когда я запускаю приложение на iPad в портретном режиме и нажимаю, чтобы переключиться на контроллер разделенного представления, делегат willHideViewController действительно вызывается, но когда он завершается, у меня остается пустая панель инструментов в моем подробном представлении. Странная часть этого заключается в том, что третий вызов NSLog, который должен выводить информацию о панели инструментов контроллера подробного представления, вместо этого выдает (null). Это становится немного странным из-за того, что предыдущий код устанавливает элементы панели инструментов, и этот код не вызывает ни одного исключения, даже если панель инструментов, по-видимому, не существует.

[Session started at 2011-02-23 16:16:59 -0500.]  
2011-02-23 16:17:02.626 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:17:02.628 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:17:02.629 TEST[33835:207] (null)  
2011-02-23 16:17:14.487 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:17:14.488 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:17:14.490 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>>  
2011-02-23 16:24:52.158 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:24:52.159 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:24:52.160 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>>

Как вы можете видеть, последующие журналы показывают, что панель инструментов жива и здорова, и мы знаем, что вызовы исходят от одного и того же объекта во всех случаях. Эти более поздние вызовы происходили просто из поворота в альбомную ориентацию, а затем обратно в портретную, так что это определенно тот же контроллер детального вида.

Итак, мой вопрос заключается в следующем: что может привести к тому, что панель инструментов вернется в нуль в первый раз, но затем будет работать правильно после того, как вы ничего не сделаете, кроме поворота iPad, и что я могу сделать, чтобы это исправить?

Заранее спасибо, Райан


person Ryan    schedule 23.02.2011    source источник


Ответы (2)


И... я нашел обходной путь. У меня был главный контроллер представления, установленный в качестве делегата контроллера разделенного представления, что обычно было нормально. Однако первый вызов willHideViewController на самом деле происходит ДО настройки подробного представления; поэтому панель инструментов еще не существует. Я переместил несколько вещей в детальный контроллер и вместо этого сделал его делегатом. Затем, помимо установки элементов панели инструментов в willHideViewController, я также устанавливаю их в viewDidLoad. Контроллер подробного представления также передает кнопку всплывающего окна и контроллер главному контроллеру представления, поскольку мастер должен иметь возможность создавать новые контроллеры подробного представления и немедленно назначать им всплывающую кнопку (ранее я забыл упомянуть, что контроллеры подробного представления нажимаются и выскочил из навигационного контроллера).

Это некрасиво, но это работает.

person Ryan    schedule 24.02.2011

Райан

Я столкнулся с той же проблемой, что и вы, и это действительно помогло мне. У меня есть вариант вашего решения, который был немного проще. Несколько ключевых моментов.

Я оставил Master как UISplitViewControllerDelegate, но добавил это свойство в свой Detail View Controller.h (и синтезировал его в .m):

@property (nonatomic, strong) UIBarButtonItem *popoverButton;

Затем при вызове prepareForSegue главного контроллера представления я получил UIBarButtonItem, который я сохранил в этом свойстве.

Затем в viewDidLoad контроллера представления Detail я просто установил этот элемент на панели инструментов.

-(void) viewDidLoad{
[super viewDidLoad];
[self setSplitViewBarButtonItem:self.popoverButton];}

где

-(void) setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem{
if (_splitViewBarButtonItem!=splitViewBarButtonItem) {
    NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy];
    if (_splitViewBarButtonItem) {
        [toolbarItems removeObject:_splitViewBarButtonItem];
    }
    if (splitViewBarButtonItem) {
        [toolbarItems insertObject:splitViewBarButtonItem atIndex:0];
    }
    self.toolbar.items=toolbarItems;
    _splitViewBarButtonItem = splitViewBarButtonItem;
}

}

Это похоже на ПОЛНЫЙ взлом, но если выход на self.toolbar в контроллере подробного представления не существует, пока вы не находитесь в viewDidLoad, что делать человеку?

person JMattos    schedule 07.04.2012