Swift - 如何在 MVC 中正确构建按钮?
Posted
技术标签:
【中文标题】Swift - 如何在 MVC 中正确构建按钮?【英文标题】:Swift - How to properly architect buttons in MVC? 【发布时间】:2015-06-17 23:21:22 【问题描述】:我编写了一段代码,在 UIView 中创建了一个 UIButtons,并在 ViewController 文件中执行了 segue 操作。 segue 操作允许用户按下 UIButton 并推送一个带有该按钮标题的新 UIView。这很好用。
然后我了解了 MVC 并决定将代码拆分到适当的位置。所以我将创建 UIView 和 UIButtons 的代码移到了一个名为 ButtonView 的新文件中。
现在我很困惑在哪里可以访问 segue 函数,因为 segue 代码是使用 @IBAction 在 ViewController 文件中定义的。
// Segue action - pushing to the new view
@IBAction func buttonAction(sender: UIButton!)
performSegueWithIdentifier("saveButton", sender: sender)
// Button action - saves the title of the button pressed into var buttonPressed
@IBAction func saveButton(sender: UIButton!)
buttonPressed = sender.currentTitle
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "saveButton"
// pass the button title string into var buttonPressed of ViewController
if let destinationVC = segue.destinationViewController as? ViewController
destinationVC.buttonPressed = buttonPressed
当我创建按钮时,我不知道如何将按钮连接到 segue 函数。在我定义按钮之前如下:
var button = UIButton.buttonWithType(UIButtonType.System) as! UIButton
button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
button.addTarget(self, action: "saveButton:", forControlEvents: UIControlEvents.TouchDown)
addSubview(button)
是将 segue 代码移动到视图中的做法...(我认为这不会起作用,而且看起来很不对劲)还是有办法通过调用来访问 segue 函数?
感谢您的帮助! 干杯,
【问题讨论】:
【参考方案1】:button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
button.addTarget(self, action: "saveButton:", forControlEvents: UIControlEvents.TouchDown)
正常情况是按钮应该向其视图控制器发送消息。这就是标准的 MVC 要做的事情——事实上,这就是 MVC 中的 VC(View 让 Controller 知道有用户交互,而 Controller 负责后续的逻辑)。
所以,在您的代码中,我认为self
不是视图控制器而是视图。在我看来,你真正想知道的是:如何将这里的self
变成“我的视图控制器,segue 代码在哪里”?
答案是:遍历 UIResponder 链 (nextResponder()
) 直到找到它。假设self
是界面中的一个UIView。那么:
var resp : UIResponder! = self
while !(resp is UIViewController) resp = resp.nextResponder()
let vc = resp as! UIViewController
现在vc
是拥有视图控制器,您现在可以将他设置为这些按钮操作的目标。
【讨论】:
感谢您的回复。似乎nextResponsder()
链给了我nil
。据我所知,self
是界面中的 UIView。有什么想法吗?
对我来说问题是你没有告诉在哪里你在运行那个代码,所以我不知道当时的状态是什么......向self
询问其window
。如果那是nil
,则您不在界面中。您需要等到您进入界面,因为在此之前您没有视图控制器并且您无法将操作定向到它。
好的,我查了self.window
,确实是零。我在我定义的 UIView 类中运行此代码。我在ViewControllerself.view.addSubview()
中调用了这个UIView Class,这不是说我在界面中了吗?
但是您仍然没有回答我的问题,即您在视图的代码中在哪里调用此代码!你是隐藏你的代码,而不是揭示它。所以我必须猜测你可能在做什么。这对你或我来说都不是很有成效。如果你需要帮助,你一定会更有帮助!例如,如果你在init(frame:)
中调用它,那还为时过早——你是先被创建的,然后然后被放入接口中——否则怎么可能?
我明白了!从你告诉我的关于nextRepsonder()
链和这个link 的内容来看,我想我可以访问我的 ViewController 了 segue 代码所在的位置。干杯!以上是关于Swift - 如何在 MVC 中正确构建按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中正确设置 imageView,如 imageContacts?