iPad UISplitПросмотреть подробную панель инструментов NULL при запуске - PullRequest
1 голос
/ 24 февраля 2011

Я ломал голову над попыткой выяснить небольшую ошибку в половине приложения для 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, и что я могу сделать, чтобы исправить это?

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

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

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

0 голосов
/ 07 апреля 2012

Райан

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

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

@property (nonatomic, strong) UIBarButtonItem *popoverButton;

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

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

-(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, чточеловек делать?

...