ios - prepareForSegue 是在 View Controller 之间传递值的正确方法吗

标签 ios swift segue

我正在尝试学习 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)是这样工作的:

  1. 您创建了一个协议(protocol),它描述了该协议(protocol)的实现者将实现的一个或多个方法。在您的情况下,您可以使用类似 NoteWriterDelegate 的协议(protocol)来实现方法 takeNote(note: String)

    protocol NoteWriterDelegate {
        func takeNote(note: String)
    }
    

    在文件中将其与您的笔记 View Controller 一起定义。

  2. 您的笔记作者将有一个可选的指向委托(delegate)的指针:

    weak var delegate: NoteWriterDelegate?
    
  3. 您需要将您的第一个 View Controller 声明为 NoteWriterDelegate:

    class ViewController: UITableViewController, NoteWriterDelegate
    
  4. 然后在您的第一个 View Controller 中实现所需的方法:

    func takeNote(note: String) {
        notes.append(note)
    }
    
  5. 当您调用 prepareForSegue 准备移动 笔记编写 View Controller 时,您将自己传递为委托(delegate):

    destinationViewController.delegate = self
    
  6. 在笔记 View Controller 中,当你有一个笔记要传回给调用者时,你在委托(delegate)上调用takeNote:

    delegate?.takeNote(self.ourTextField?.text ?? "")
    

通过这种方式,您的笔记编写器只知道它正在与 NoteWriterDelegate 对话。如果您想在将来重用它,只需将笔记编写器类放到另一个项目中,实现委托(delegate),它就可以工作,而无需触及笔记编写器类中的代码。

关于ios - prepareForSegue 是在 View Controller 之间传递值的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27457091/

相关文章:

android - TextField 模糊在 Nativescript vue 中不起作用

swift - 在 Foundation 中找不到 FileManager Swift 类,它在哪里?

ios - 通过 Storyboard Segue 在类之间传递时, bool 变量始终为 false

ios - UITableViewCell 在关闭模态呈现的 ViewController 后不反射(reflect)更改

ios - Error Domain=NSCocoaErrorDomain Code=3840 是属于服务器端还是本地代码端?

ios - 当 View 出现在屏幕上时,如何让键盘将 View 向上推? Xcode swift

ios - 减小 UITableViewRowAction 的字体大小

ios - Swift 自动续订订阅问题

ios - 如何在两个 Storyboard之间切换而不中断动画?(swift 3)

ios - 每当将新 child 添加到我的 firebase 数据库中的节点时,我想向用户发送通知