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?

在 MVC 设计中构建正确的模型

Swift2:TKSubmitTransitionButton。当用户登录/注册不正确时,如何停止按钮的转换/动画

如何在 Swift 2.0 中使用完成按钮做数字键盘?

触摸另一个控件(如按钮)Swift 2.0时如何隐藏键盘

如何在 Swift 中使用 UIKit 注册多个按钮点击?