如何在视图控制器之间传递字符串而不使用SEGUE

时间:2015-12-22 21:42:52

标签: swift uiview storyboard

最近我一直在创建一个应用程序,您可以在其中创建和测验自己的定义或任何事情。在用户点击创建按钮以生成新记录卡的标题后,我将数据传递到下一个视图。我现在使用的代码是:

override  func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

let DestViewController: Card1 = segue.destinationViewController as! Card1

DestViewController.Content = Notetitle.text!


self.saved = self.Notetitle.text!


}

所有这些都有效但是,只有在viewcontrollers之间有一个segue时它才会起作用。我需要能够通过segue传递数据,因为我希望用户能够创建任意数量的记录卡,而我现在尝试这样做的方法是使用此代码制作副本UIView然后放入新数据(主视图)。新视图只能使用IBAction创建。准备segue我不能在IBAction中使用,因为它是它自己的覆盖函数。

这是我用来制作新视图的代码:

let newCard =
    self.storyboard!.instantiateViewControllerWithIdentifier("Main")

self.presentViewController(newCard, animated: true, completion:nil)

我希望我能够创建一个新视图,然后传入用户刚刚在记录卡上进行的数据传递。 (希望这有任何意义)

主要主题:创建一个新视图并传入新数据问题:可以在没有segue的情况下传递数据没有:/ - 能够在没有segue的视图控制器之间传递数据:)

我对这一切都是新手大约5个月。我的所有代码都很快。请放轻松吧。如有任何问题或意见,请随时与我联系。我已经在这个问题上发了一个问题,但我没有得到答案,所以就这样了。

谢谢Lucas Mazza

1 个答案:

答案 0 :(得分:1)

除非确实需要,否则不要使用全局变量。使全局静态单例不遵循最佳实践。有关更多信息,请阅读:What is so bad about singletons?

更好的解决方案

您可以使用协议委托模式。我实际上在这里写了一篇关于这个主题的文章:

https://www.codebeaulieu.com/36/Passing-data-with-the-protocol-delegate-pattern

您需要一个定义接受数据的函数的协议。然后你的其他视图控制器将需要实现委托。如果您需要逐步详细信息,请参阅上面提供的链接,或者您只需下载下面的项目并检查代码。

Download Working Example Project

以下是使协议委托模式有效的代码:

查看控制器1:

class ViewController: UIViewController, PresentedViewControllerDelegate {

    @IBOutlet weak var textOutlet: UILabel!
    @IBAction func doPresent(sender: AnyObject) {
        let pvc = storyboard?.instantiateViewControllerWithIdentifier("PresentedViewController") as! PresentedViewController

        pvc.data = "important data sent via delegate!"
        pvc.delegate = self
        self.presentViewController(pvc, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func acceptData(data: AnyObject!) {

        self.textOutlet.text = "\(data!)"

    }
}

查看控制器2:

import UIKit

// place the protocol in the view controller that is being presented
protocol PresentedViewControllerDelegate {
    func acceptData(data: AnyObject!)
}

class PresentedViewController: UIViewController {
    // create a variable that will recieve / send messages
    // between the view controllers.
    var delegate : PresentedViewControllerDelegate?
    // another data outlet
    var data : AnyObject?


    @IBOutlet weak var textFieldOutlet: UITextField!
    @IBAction func doDismiss(sender: AnyObject) {
        if textFieldOutlet.text != "" {
            self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        print("\(data!)")

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        if self.isBeingDismissed() {
            self.delegate?.acceptData(textFieldOutlet.text)
        }
    }
}