swift - 如何在不使用 SEGUE 的情况下在 View Controller 之间传递字符串

标签 swift uiview storyboard

最近我一直在制作一个应用程序,您可以在其中创建定义或与此相关的任何内容并 self 测验。在用户点击创建按钮制作新记事卡的标题后,我将数据传递到下一个 View 。我现在使用的代码是:

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

let DestViewController: Card1 = segue.destinationViewController as! Card1

DestViewController.Content = Notetitle.text!


self.saved = self.Notetitle.text!


}

所有这些都有效,但只有当我在 View Controller 之间有一个 segue 时它才会有效。我需要能够在没有 segue 的情况下传递该数据,因为我希望用户能够根据需要创建尽可能多的记事卡,而我现在尝试这样做的方式是使用此代码制作副本UIView 然后放入新数据(主视图)。新 View 只能使用 IBAction 创建。我不能在 IBAction 中使用 prepare for segue,因为它是自己的覆盖函数。

这是我用来创建新 View 的代码:

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

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

我希望我能够制作一个新的 View ,然后将用户刚刚制作的数据传递到记事卡上。 (希望这有任何意义)

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

我刚接触这一切大约 5 个月。我所有的代码都很快。请对我放轻松。如有任何问题或意见,请随时问我。我已经就此发布了一个问题,但我没有得到答案,所以请继续。

谢谢,卢卡斯马扎

最佳答案

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

更好的解决方案

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

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

您需要一个协议(protocol)来定义接受数据的函数。然后你的其他 View Controller 将需要实现委托(delegate)。如果您需要分步详细信息,请参阅上面提供的链接,或者您可以简单地下载下面的项目并检查代码。

Download Working Example Project

下面是使您的协议(protocol)委托(delegate)模式工作的代码:

View Controller 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!)"

    }
}

View Controller 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)
        }
    }
}

关于swift - 如何在不使用 SEGUE 的情况下在 View Controller 之间传递字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424913/

相关文章:

ios - 打开 Swift Playground 书

json - Nil 与预期的参数类型 'JSON' 不兼容

ios - LMColumnView 和 LMRowView 始终保持左右间距

UIViewController 内的 iOS 自定义 UITableViewController

ios - 无法在 Storyboard iOS8 的导航栏中添加右栏按钮

ios - 使用 prepareForSegue Swift 传递对象

ios - 向 WKWebView 发送消息抛出错误

iOS:实现多个部分设置的最佳方式

IOS:编程 rootViewController 以不同方式呈现 View 到 Storyboard 'isInitialView'

ios - 如何在 Storyboard编辑器中调整 UINavigationController 的大小