2015-07-23 2 views
3

Я имел некоторый код, используя новый класс UIAlertController, который работал нормально в прошивкой 8. Теперь сбой в прошивке 9 со следующим сообщением об ошибке:Проблема с использованием barButtonItem для popoverPresentation Контроллер в iOS 9?

2015-07-23 10:38:27.499 MyApp[828:563509] -[UITabBarItem _viewForPresenting]: unrecognized selector sent to instance 0x157644960 
2015-07-23 10:38:27.500 MyApp[828:563509] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarItem _viewForPresenting]: unrecognized selector sent to instance 0x157644960' 

Проблема, кажется, использует barButtonItem чтобы настроить popoverPresentationController, а не просто использовать sourceView/sourceRect. Если я переключусь на последнее, это прекрасно (но, конечно, лист действий не появляется из того места, где я хотел его всплыть). Пока что сообщение об ошибке в Google не было пустым.

Вот код. Это довольно просто, ничего особенного здесь:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"What do you want to do?" message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 
    [alertController addAction:[UIAlertAction actionWithTitle:@"Clear Call History" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { 
     [self confirmClearCallHistory]; 
    }]]; 
    [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]]; 
    [alertController setModalPresentationStyle:UIModalPresentationPopover]; 

    //if I do this (like I want to), it crashes: 
    [alertController popoverPresentationController].barButtonItem = self.tabBarController.callsTab; 

    // if I do this, it's fine: 
    // [alertController popoverPresentationController].sourceView = self.editButton; 
    // [alertController popoverPresentationController].sourceRect = self.editButton.bounds; 

    [self presentViewController:alertController animated:YES completion:nil]; 

У кого-нибудь еще были подобные проблемы? Это то же самое во всех трех бета-версиях iOS 9 до сих пор ...

(О, и я должен упомянуть, что он падает только на iPad, а не на iPhone ... но это неудивительно, потому что режим презентации для листа действий это нет-op на iPhone, то есть все листы действий представлены одинаково независимо от того, что)

+1

У меня такая же проблема, но до сих пор не найдено решение ... Разве вы? – Insider

ответ

2

О, интересно. Я фактически передаю экземпляр UITabBarItem в поле barButtonItem. (Я унаследовал старый код, поэтому я не знал об этом) Как-то, это действительно работало на iOS 8? Идите фигуру.

Так что да, я не могу этого сделать. хе.

2

Вот такой подход, который я использую. Я получаю значение представления из UIBarButtonItem и использую его как исходное представление.

func settingsButtonAction(sender:UIBarButtonItem) { 
     let viewController = UIViewController() 
     viewController.modalPresentationStyle = .Popover 
     if let presenter = viewController.popoverPresentationController { 
      let targetView = sender.valueForKey("view") as! UIView 
      presenter.sourceView = targetView; 
      presenter.sourceRect = targetView.bounds; 
     } 
     presentViewController(viewController, animated: true, completion: nil) 
    } 
1

В вашем методе обработчика, если у вас есть отправитель как «AnyObject». Вы можете прямое применение,

alertController.popoverPresentationController?.sourceRect = sender.bounds 
alertController.popoverPresentationController?.sourceView = sender as? UIView 
self.presentViewController(alertController, animated: true, completion: nil) 
0

О, круто! Похоже, вы можете установить элемент кнопки панели источника в UIPopoverPresentationController.

popoverPresentationController?.barButtonItem = myBarButtonItem 

Я сделал это, и он отлично работает, без необходимости копать через частные подземелья.

Согласно документации, это было доступно с iOS 8. Таким образом, он всегда был в iOS 9.

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