Подтвердить что ты не робот

UISplitViewController не показывает кнопку всплывающего окна при запуске портрета

Я делаю приложение iPad на основе UISplitViewController. У меня есть небольшая проблема с кнопкой toobar, когда мое приложение запускается в potrait. Кнопка, отображающая popover, не отображается. Однако, когда я поворачиваю свой iPad в альбом, а затем обратно на портрет, кнопка показывает!

Похоже, что при запуске не вызывается следующий метод (это был код, показывающий кнопку):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

Этот метод не вызывается, когда приложение запускается, но только при наличии вращения. Еще страннее то, что я сделал тестовое приложение, используя Xcode UISplitViewController template + core data (который похож на приложение, над которым я работаю, и является шаблоном, который я использовал для создания этого приложения). В тестовом приложении, на котором я не сделал ни одной строки кода, кнопка показывает, когда я запускаю свое приложение в портретном режиме, а метод выше также называется запуском, в отличие от моего другого приложения. У кого-то была аналогичная проблема?

Наконец, из документации Apple не совсем ясно, должен ли этот метод вызываться, когда сначала отображается UISplitViewController: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

4b9b3361

Ответ 1

"Kshitiz" имеет правильное понятие. сначала я установил self.splitviewController.delegate = self в методе viewDidLoad, который немного опоздал, чтобы установить эту делецию. Итак, я попытался установить делегацию на более ранней стадии, которая является методом awakeFromNib. Тогда он работает хорошо.

Таким образом, проблема заключается в том, что после просмотра уже загружен viewDidLoad, тогда делегация не будет работать, она будет работать некоторое время после некоторых действий (например, повернуть iPad). Таким образом, более ранняя стадия, чем viewDidLoad, является awakeFromNib.

Вот код, который работает:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

Ответ 2

Установили ли вы делегат splitviewcontroller? Как правило, проблема возникает, когда делегат не установлен.

Ответ 3

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

Ответ 4

У меня была одна и та же проблема, и ответ Мартина Гуннарсона привел меня к решению.

До этого я устанавливал свойство делегирования UISplitViewController после того, как представление делегата (детальное представление) уже было загружено, в viewDidLoad:. К этому времени UISplitViewController уже отправил исходное сообщение splitViewController:willHideViewController:withBarButtonItem:forPopoverController:. Я просто не назначил делегата достаточно скоро.

Решение заключалось в том, чтобы назначить делегата в главном делете приложения, в application:DidFinishLaunchingWithOptions:. В этом случае мой делегат содержался в навигационном контроллере, поэтому мне пришлось вырыть один слой глубже, чтобы получить его.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}

Ответ 5

Это тоже меня поместило, тем более, что я работаю над двумя проектами iPad с готовым контроллером splitViewController, и первый всегда показывает кнопку "Мастер", а второй никогда не делал этого. Я сравнивал выходы и отношения и делегаты, пока я не перекрестился, но, наконец, нашел ответ в appDelegate. Оказалось, что я прокомментировал слишком много в приложении: didFinishLaunchingWithOptions:, в частности, где установлен splitViewController.delegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

Добавление этого в appDelegate избавляет вас от необходимости подклассифицировать splitViewController. Я также попытался подключить делегата в IB, но по какой-то причине у него не было бы никого из этого. Нарушение дизайна раскадровки, imho.

Ответ 6

Я давно застрял на этом. Наконец он получил его на работу. БодрствованиеFromNib не сработало для меня. Сделано didFinishLaunchingWithOptions. Возможно, потому, что я запускаю некоторый запрос, который заполняет элементы в контроллере popover.