Определить, когда UISplitViewController меняет режим отображения - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь использовать UISplitViewController, где вторичный контроллер должен предоставлять функцию «закрыть» (через кнопку или элемент панели кнопок) всякий раз, когда UISplitViewController находится в режиме рядом, но должен скрывать функцию в другом раз. Я попытался поместить это во вторичный контроллер представления:

override func viewWillAppear(_ animated: Bool) {
    if splitViewController!.primaryHidden {
        // hide the "close" UI artifact
    } else {
        // show the "close" UI artifact
    }
}

Это правильно устанавливает видимость функции «закрыть» при первом отображении вторичного представления, но если UISplitViewController переключается между развернутым и свернутым (скажем, вращением iPhone 6s Plus), то эта функция больше не вызывается ( что имеет смысл, так как дополнительный контроллер остается видимым). Следовательно, функция «close» остается в своем исходном состоянии - скрытом или показанном - даже когда UISplitViewController меняет режим.

Как я могу заставить функцию "закрыть" скрывать или отображать в ответ на изменения в режиме UISplitViewController?

Ответы [ 2 ]

0 голосов
/ 03 августа 2018

Для этого есть уведомление UIViewControllerShowDetailTargetDidChangeNotification:

// Sometimes view controllers that are using showViewController:sender and
// showDetailViewController:sender: will need to know when the split view
// controller environment above it has changed. This notification will be 
// posted when that happens (for example, when a split view controller is
// collapsing or expanding). The NSNotification's object will be the view
// controller that caused the change.
UIKIT_EXTERN NSNotificationName const UIViewControllerShowDetailTargetDidChangeNotification NS_AVAILABLE_IOS(8_0);

Использовать следующим образом

- (void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showDetailTargetDidChange:) name:UIViewControllerShowDetailTargetDidChangeNotification object:self.splitViewController];
}

- (void)showDetailTargetDidChange:(NSNotification *)notification{
    // changed from collapsed to expanded or vice versa
}
0 голосов
/ 06 мая 2018

Хорошо, я нашел простое решение. Я делал ошибку новичка. Хитрость заключается в том, чтобы переопределить viewWillLayoutSubviews() вместо viewWillAppear(animated:). Тогда все работает как я хочу. Кажется, что viewWillLayoutSubviews() вызывается (иногда более одного раза) каждый раз, когда содержащий UISplitViewController меняет свой режим отображения, и это именно то, на что я должен ответить. Единственная ошибка в том, что splitViewController может быть nil для некоторых из этих вызовов, поэтому его необходимо реализовать следующим образом:

override func viewWillAppear(_ animated: Bool) {
    if let svc = splitViewController {
        if svc.primaryHidden {
            // hide the "close" UI artifact
        } else {
            // show the "close" UI artifact
        }
    }
}

В процессе поиска решения я попытался переопределить traitCollectionDidChange(previousTraitCollection:). (Я попробовал это, потому что хотел отреагировать на повороты устройства.) Сначала я подумал, что на что-то натолкнулся, потому что эта функция также вызывается всякий раз, когда устройство вращается. Интересно (и, к сожалению), я обнаружил, что свойство splitViewController моего представления было nil, когда эта функция вызывается. Кажется странным, что это должно быть так, поскольку ни viewDidDisappear(animated:), ни viewWillAppear(animated:) не вызывается, когда UISplitViewController переконфигурирует себя. Но почему это должно быть nil, я полагаю, вопрос на другой день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...