委托展示 VC,来自 Popover

Posted

技术标签:

【中文标题】委托展示 VC,来自 Popover【英文标题】:Delegation to Presenting VC, From a Popover 【发布时间】:2016-02-07 13:05:55 【问题描述】:

我将一个 ViewController 拖到我的情节提要上,使用 popover segue 对其进行了连接,并在 presentingVC 的 prepareForSegue 中设置了大小和样式。我的问题是,如果我的弹出框有几个按钮,它们的代码应该在哪里执行?

    例如,我是否应该使用委托模式,在prepareForSegue 中,我将委托引用作为self 传递?然后向后委托? 或者,我应该为弹出框创建一个新的 viewController,然后将要运行的代码放入其中吗? 我也看了this tutorial,有人说...

" 然后你通过使用 popoverPresentationController.presentedViewController 方法中 UIPopoverPresentationController

什么对我来说是理想的,因为我想要的代码会改变一些presentingVC变量,会被委托回presenting VC。

【问题讨论】:

【参考方案1】:

只需将prepareForSegue中的弹出按钮操作设置为指向presentingVC中的函数即可。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if let dest = segue.destinationViewController as? MyPopoverViewController 
        let myButton = dest.view.viewWithTag(MY_BUTTON_TAG) as! UIButton
        myButton.addTarget(self, action: "onMyButton", forControlEvents: .TouchUpInside)
    


func onMyButton() 
    ...

或者使用这样的 UIButton 扩展来更好地使用闭包:

https://www.mikeash.com/pyblog/friday-qa-2015-12-25-swifty-targetaction.html

【讨论】:

谢谢塔帕尼。我以前从未见过这样的方法。你介意解释为什么这是这样做的吗?作为一名开发人员,我喜欢进步,而不仅仅是在我的应用程序中实现代码而不理解它。为什么是这种新方式而不是委托? 我不相信这会奏效。 destinationViewController 中的 outlet 未在 prepareForSegue 时间设置,因此 dest.myButton 将是 nil 您总是可以通过标签找到按钮。这样就不需要设置出口,甚至不需要弹出视图控制器的类。 我认为,当块被引入到 Objective-C 时,委托变得过时了,在 Swift 闭包中更是如此。我将为 popoverOverViewController 创建一个类,连接 IBActions 并在动作处理程序中调用一个闭包。在 prepareForSegue 中,我将设置动作处理程序调用的闭包。然而,viewWithTag 方法需要的代码更少。【参考方案2】:

最终只是在dismiss popover调用的竞争块中与delegation一起去了:

class NavigationViewController: UIViewController 

    var presentingVC_Delegate: mainLists_PopoverDelegation!
    var whatToDo = "Placeholder"

    @IBOutlet var shareBtn: UIButton!
    @IBOutlet var clearBtn: UIButton!
    @IBOutlet var settingsBtn: UIButton!

    //***** ----- ***** ------ ***** ----- ***** ----- *****
    //Menu Button Functions
    //***** ----- ***** ------ ***** ----- ***** ----- *****
    @IBAction func shareBtn_Pressed(sender: AnyObject) 
        self.dismissViewControllerAnimated(true, completion:  finished in
            self.presentingVC_Delegate.call_ActivityVC()
        )
    
    @IBAction func clearBtn_Pressed(sender: AnyObject) 
        self.dismissViewControllerAnimated(true, completion:  finished in
            self.presentingVC_Delegate.deleteList()
        )
    
    @IBAction func settingsBtn_Pressed(sender: AnyObject) 
        self.dismissViewControllerAnimated(true, completion:  finished in
            self.presentingVC_Delegate.presentSettingsVC()
        )
    


protocol mainLists_PopoverDelegation 
  func call_ActivityVC ()
  func deleteList ()
  func presentSettingsVC ()

这三个函数位于主 VC 中。

【讨论】:

以上是关于委托展示 VC,来自 Popover的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Swift 中展示来自 Xib 的 VC?

来自应用委托的 presentModalViewController

使用委托从 VC2 取消隐藏 VC1 中的按钮

MFMessageComposeVIewController 正在解除它的委托而不是它自己

将 Array 传递给 XLPagerTabBar 委托函数以打开 VC

如何从目标 VC 的子级为协议设置委托?