Программно показать / скрыть главное представление в UISplitViewController

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

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

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

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

2 ответа

Там нет прямого пути.

Функциональным, но немного хакерским решением было бы установить делегата и записать 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
}

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

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

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

[theSplitViewController toggleMasterVisible: nil];

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

Другие вопросы по тегам