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

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

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

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

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

【问题讨论】:

    标签: ios swift delegates uipopovercontroller


    【解决方案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 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多