Swift:将 UIBarButtonItem 设置为不点击弹出框的源?

Swift: Set UIBarButtonItem as source for popover WITHOUT tap?

提问人:paco8 提问时间:3/4/2020 更新时间:3/4/2020 访问量:913

问:

我想在我的视图加载后立即在 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。

Swift UIPopOverPresentationController

评论


答:

0赞 Harish 3/4/2020 #1
  1. 您需要提供 .sourceView
  2. UIAlertController必须具有要显示的 、 a 或操作。titlemessage

    // 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)
    }
    

评论

0赞 paco8 3/4/2020
感谢您的回答,但是添加此行后,应用程序崩溃并显示相同的错误消息。
0赞 Harish 3/4/2020
您收到的是相同的错误还是不同的错误?您在哪里调用 displayOptions 函数。使用完整代码更新问题。
0赞 paco8 3/4/2020
就像我说的,错误和以前完全一样。我正在尝试从viewDidLoad调用此函数,但尝试从viewDidAppear调用相同的结果。
0赞 Harish 3/4/2020
检查我更新的答案。如果错误仍然存在,请显示源按钮,即 UIBarButtonItem 代码。
0赞 paco8 3/4/2020
感谢您的帮助。您的答案就像我的原始代码一样,在点击按钮时有效,但当我从 viewDidLoad 调用函数时仍然崩溃。
1赞 JackDao 3/4/2020 #2

尝试使用 UIPopoverPresentationControllerDelegate

代码示例:

  • viewDid加载

    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
    }