最近我一直在制作一个应用程序,您可以在其中创建定义或与此相关的任何内容并 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/