我正在尝试学习 Swift,并且正在尝试开发著名的笔记应用程序。
有一个数组绑定(bind)到一个 TableView 和另一个用于添加注释的 View 。 在第二个 View 中,textfieldshouldreturn 事件触发一个 segue 并返回到 tableview。
我想知道这是否是正确的方法。因为通过这种方式,我在另一个 View Controller 中操作变量。我不是 MVC 大师,但我觉得这是错误的。这是我的代码片段:
func textFieldShouldReturn(textField: UITextField) -> Bool {
self.performSegueWithIdentifier("backSegue", sender: self)
return true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "backSegue"){
let navController = segue.destinationViewController as UINavigationController;
let myController = navController.topViewController as NotesTableViewController;
if(self.ourTextField?.text != nil || self.ourTextField?.text != ""){
myController.notes.append(self.ourTextField?.text ?? "");
}
}
}
谢谢。
最佳答案
你的问题不是关于 prepareForSegue
而是 View Controller 之间的关系。您的设计“感觉不对”的原因是事实。问题是你的笔记 View Controller 对正在使用它的 View Controller 了解得太多了,因为它直接从调用 View Controller 操作一个变量。为了直接操作变量,它必须知道调用者的类。
为什么这是个问题?它使您的笔记书写 View Controller 的可重用性降低。如果你正确地编写了 note writing view controller,那么你可以在其他应用程序中重用它。为了使其可重用,您需要将笔记 View Controller 与调用者分离 - 它不能知道到底是谁在调用它。
那么问题就变成了,如果我不知道是谁给我打电话,我该如何将数据传回给调用者?答案是委派。
委托(delegate)是这样工作的:
您创建了一个协议(protocol),它描述了该协议(protocol)的实现者将实现的一个或多个方法。在您的情况下,您可以使用类似
NoteWriterDelegate
的协议(protocol)来实现方法takeNote(note: String)
。protocol NoteWriterDelegate { func takeNote(note: String) }
在文件中将其与您的笔记 View Controller 一起定义。
您的笔记作者将有一个可选的指向委托(delegate)的指针:
weak var delegate: NoteWriterDelegate?
您需要将您的第一个 View Controller 声明为
NoteWriterDelegate
:class ViewController: UITableViewController, NoteWriterDelegate
然后在您的第一个 View Controller 中实现所需的方法:
func takeNote(note: String) { notes.append(note) }
当您调用
prepareForSegue
准备移动 笔记编写 View Controller 时,您将自己传递为委托(delegate):destinationViewController.delegate = self
在笔记 View Controller 中,当你有一个笔记要传回给调用者时,你在委托(delegate)上调用
takeNote
:delegate?.takeNote(self.ourTextField?.text ?? "")
通过这种方式,您的笔记编写器只知道它正在与 NoteWriterDelegate
对话。如果您想在将来重用它,只需将笔记编写器类放到另一个项目中,实现委托(delegate),它就可以工作,而无需触及笔记编写器类中的代码。
关于ios - prepareForSegue 是在 View Controller 之间传递值的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27457091/