Swift: установить UIBarButtonItem в качестве источника для всплывающего окна БЕЗ касания? - PullRequest
0 голосов
/ 04 марта 2020

Я хочу показать всплывающее окно на iPad, как только загрузится мой вид с кнопкой в ​​верхнем правом углу. Всплывающее окно отображается правильно при нажатии кнопки, но я не могу найти способ отобразить его без нажатия кнопки при первой загрузке страницы. Это возможно?

Вот что у меня есть:

func displayOptions(sourceButton: UIBarButtonItem)
    let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
    if let popoverController = actionSheet.popoverPresentationController {
        var rect = CGRect(x: 0, y: 0, width: 0, height: 0)              
        popoverController.barButtonItem = sourceButton              
        popoverController.sourceRect = rect 
        popoverController.permittedArrowDirections = .up
    }
    viewController.present(actionSheet, animated: true, completion: nil)
}

Этот код работает правильно при нажатии кнопки, но приложение вылетает, если я пытаюсь вызвать эту функцию из viewDidLoad или viewDidAppear:

Вы должны предоставить информацию о местоположении для этого всплывающего окна через контроллер popoverPresentationController контроллера предупреждений. Вы должны предоставить либо sourceView и sourceRect, либо barButtonItem.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Попробуйте использовать UIPopoverPresentationControllerDelegate

Пример кода:

  • viewDidLoad

    let buttonCustom = UIBarButtonItem(title: "Custom", style: .done, target: self, action: #selector(ViewController.customBarButtonAction))
    self.navigationItem.rightBarButtonItem  = buttonCustom
    displayOptions()
    
  • displayOptions

    func displayOptions() {
        let actionSheet = UIAlertController(title: "Title", message: "Message", preferredStyle: .actionSheet)
        if let popoverController = actionSheet.popoverPresentationController {
            let rect = CGRect(x: 0, y: 0, width: 0, height: 0)
            popoverController.sourceRect = rect
            popoverController.sourceView = self.view
            popoverController.permittedArrowDirections = .up
            popoverController.delegate = self
        }
        self.present(actionSheet, animated: true, completion: nil)
    }
    
  • с использованием UIPopoverPresentationControllerDelegate

    func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) {
        popoverPresentationController.barButtonItem = self.navigationItem.rightBarButtonItem
    } 
    
0 голосов
/ 04 марта 2020
  1. Вам необходимо предоставить sourceView.
  2. UIAlertController должен иметь title, message или действие для отображения.

    // Create a bar button item in ViewDidLoad.
    let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action"))
    self.navigationItem.rightBarButtonItem  = button1
    
    
    // Call in ViewDidLoad
    displayOptions(sourceButton: button1)
    
    func displayOptions(sourceButton: UIBarButtonItem) {
        let actionSheet = UIAlertController(title: "title", message: "message", preferredStyle: .actionSheet)
        if let popoverController = actionSheet.popoverPresentationController {
          let rect = CGRect(x: 0, y: 0, width: 0, height: 0)
          popoverController.barButtonItem = sourceButton
          popoverController.sourceRect = rect
          popoverController.sourceView = self.view
          popoverController.permittedArrowDirections = .up
        }
        self.present(actionSheet, animated: true, completion: nil)
    }
    
...