2013-03-04 2 views
1

У меня есть приложение, которое использует UISplitViewController. Когда в Ландшафтной ориентации мы иногда хотим показать мастер-представление все время, а иногда хотим, чтобы он автоматически скрывался, как в портретной ориентации. В настоящее время этот параметр можно настроить в приложении.Программно показать/скрыть главный вид в UISplitViewController

Все это хорошо работает, за исключением одной вещи. Когда я изменю настройку, я хочу, чтобы настройка автоматического скрытия вступила в силу немедленно, а не только в следующий раз, когда я поворачиваю устройство (т. Е. Когда - splitViewController: shouldHideViewController: inOrientation: вызывается).

Есть ли способ (программно) заставить UISplitViewController выскочить/скрыть главное представление, чтобы SVC запросил splitViewController: shouldHideViewController: inOrientation: метод снова?

Любая помощь была бы принята с благодарностью.

ответ

3

Нет прямого пути.

Функциональным, но немного взломанным решением было бы установить делегат и записать barButtonItem, переданный делегату при показе/скрытии мастера. Вы можете использовать его, чтобы просто активировать действие на кнопке. Но, как я уже сказал, это не очень хороший способ сделать это (и может сломаться в будущем):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc 
{ 
    _buttonItem = barButtonItem; 
    // ... 
} 

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)button 
{ 
    _buttonItem = nil; 
    // ... 
} 

- (void)toggleMasterVisible 
{ 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
    [_buttonItem.target performSelector:_buttonItem.action]; 
#pragma clang diagnostic pop 
} 
+0

К сожалению, если основной вид изначально видимый (например, shouldHideViewController возвращает NO), то при изменении параметра у меня нет UIBarButtonItem для работы. –

+0

О, я вижу. Боюсь, что нет способа удалить мастера. –

+0

@NikolaiRuheReason, @George Sealy Причиной этого может быть то, что 'shouldHideViewController' возвращает' NO' показывает мастер и детали рядом друг с другом (даже если в портретной ориентации), а не мастер как «наложение» поверх деталей. Это означает, что его нельзя «вытащить», чтобы показать полный контроллер представления подробностей, поскольку он является частью разделенного представления. – anneblue

0

Для существующей кнопки, вы можете добавить эту цель, чтобы достичь того, чего вы хотите:

[button addTarget: theSplitViewController action: @selector(toggleMasterVisible:) forControlEvents:UIControlEventTouchUpInside]; 

я должен предположить, что означает, что вы можете просто позвонить

[theSplitViewController toggleMasterVisible: nil]; 

Это совершенно без документов, но он имеет такое же поведение, как barButtonItem вы получаете от функции willHideViewController.

+0

доступен для ios 6, и яблоко одобрит недокументированную функцию? –

Смежные вопросы