最近我一直在创建一个应用程序,您可以在其中创建和测验自己的定义或任何事情。在用户点击创建按钮以生成新记录卡的标题后,我将数据传递到下一个视图。我现在使用的代码是:
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
答案 0 :(得分:1)
除非确实需要,否则不要使用全局变量。使全局静态单例不遵循最佳实践。有关更多信息,请阅读:What is so bad about singletons?
您可以使用协议委托模式。我实际上在这里写了一篇关于这个主题的文章:
https://www.codebeaulieu.com/36/Passing-data-with-the-protocol-delegate-pattern
您需要一个定义接受数据的函数的协议。然后你的其他视图控制器将需要实现委托。如果您需要逐步详细信息,请参阅上面提供的链接,或者您只需下载下面的项目并检查代码。
以下是使协议委托模式有效的代码:
查看控制器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)
}
}
}