提问人:paco8 提问时间:3/4/2020 更新时间:3/4/2020 访问量:913
Swift:将 UIBarButtonItem 设置为不点击弹出框的源?
Swift: Set UIBarButtonItem as source for popover WITHOUT tap?
问:
我想在我的视图加载后立即在 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。
答:
0赞
Harish
3/4/2020
#1
- 您需要提供 .
sourceView
UIAlertController
必须具有要显示的 、 a 或操作。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) }
评论
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 }
评论