委托展示 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的主要内容,如果未能解决你的问题,请参考以下文章
来自应用委托的 presentModalViewController
MFMessageComposeVIewController 正在解除它的委托而不是它自己