我正在更新应用程序以使用通用情节提要。我已经使用界面构建器通过将新按钮从按钮拖到我的新的ViewController中并选择“ Present As Popover”作为弹出按钮,为新的ViewController创建了一个弹出按钮。
[当用户在弹出窗口外按下时(将其关闭),我需要在呈现视图控制器中得到通知,以便撤消其操作。我该怎么办?
通常,我会手动创建弹出窗口,并使我的viewcontroller成为弹出窗口的委托;让我可以使用popoverControllerDidDismissPopover委托回调。但是,iOS9中不推荐使用此方法,即使不是,我也不知道在哪里可以找到弹出窗口,因此可以将其委托设置为我的视图控制器。
[不确定您所指的是哪种方法已被弃用,但您仍然可以使用UIPopoverPresentationControllerDelegate
来实现。类似于:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "popoverSegue" {
let vc = segue.destinationViewController
sortVC.modalPresentationStyle = .Popover
sortVC.popoverPresentationController?.sourceRect = filterButton.bounds
sortVC.preferredContentSize = CGSizeMake(216, 150)
sortVC.popoverPresentationController!.delegate = self
}
}
然后使用
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)
处理其解雇的方法。
popoverControllerDidDismissPopover:
方法已由popoverPresentationControllerShouldDismissPopover:
替代,因为UIPopoverControllerDelegate
已由UIPopoverPresentationControllerDelegate
替代。
从您的呈现视图控制器中,遵循新协议,并在prepareForSegue:
中设置弹出窗口呈现控制器的委托:
class MyPresentingViewController: UIViewController, UIPopoverPresentationControllerDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let popoverPresentationController = segue.destinationViewController.popoverPresentationController {
popoverPresentationController.delegate = self
}
}
func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
return true
}
}
然后,您可以使用委托方法以以前打算的方式处理对解雇的检测。
我发现,如果您要检测所有解雇,则最好使用在viewWillDisappear()中调用的闭包,而不是仅使用在视图外部触摸时才进行检测的委托。这样一来,您就可以将所有解雇都集中在一个地方。
class SecondViewController: UIViewController {
var leaveAction: (() -> Void)?
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
leaveAction?()
}
}
class FirstViewController: UIViewController {
private var isShowingPopover = false
// ...
// Storyboard equivalent will work too
@objc private func popoverTapped() {
let vc = SecondViewController()
isShowingPopover = true
vc.leaveAction = { [weak self] in
// Gets called when leaveAction?() is called in SecondViewController
self?.isShowingPopover = false
}
vc.modalPresentationStyle = .popover
vc.popoverPresentationController?.sourceRect = filterButton.bounds
vc.preferredContentSize = CGSizeMake(216, 150)
vc.popoverPresentationController?.delegate = self
present(vc, animated: true)
}
}
// MARK: - Popover delegates
extension FirstViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
return true
}
}