Swift 如何作为操作更改ViewController之间的数据?
我在ViewController之间作为操作传递数据时遇到问题。这意味着: ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ...Swift 如何作为操作更改ViewController之间的数据?,swift,xcode,uiviewcontroller,swift3,action,Swift,Xcode,Uiviewcontroller,Swift3,Action,我在ViewController之间作为操作传递数据时遇到问题。这意味着: ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ... final
final class Singleton{
private init(){ }
static let shared = Singleton()
var someInt: Int = Int()
}
ViewController1-导航控制器等-。。。
|
|
ViewController2----。。。
所以我有两个视图控制器。ViewController1有一个变量(比如var myName:String=“Joana”)
我想通过点击ViewController2中的一个按钮来改变它。
我的问题是:我如何做到这一点(我知道如何在通过segue直接连接但不与动作结合的VCs之间传递数据,这是我的问题)?
我听说过prepare(对于segue:UIStoryboardSegue,sender:Any?),但我认为它只有在两个风投之间(直接)存在segue时才有效。
总结如下:
VC2:按钮:操作->将VC1上的变量“myname”更改为“hello”,无直接序列。
提前感谢您的帮助!:-) 看看它:
class FirstVC: UIViewController {
var someAttribute: String = "ola!"
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let segueIdentifier = segue.identifier else { return }
if segueIdentifier == "YourSegueIdentifierFromStoryBoard" {
guard let viewController = segue.destination as? SecondVC else { return }
// someAttribute == "ola!"
viewController.someButtonTappedHandler = { [weak self] (newValue) in
guard let strongSelf = self else { return }
strongSelf.someAttribute = newValue
// someAttribute == "Bla Bla Bla!"
}
}
}
}
class SecondVC: UIViewController {
var someButtonTappedHandler: ((String) -> Void)?
@IBAction func someButtonTapped() {
if let handler = someButtonTappedHandler {
handler("Bla Bla Bla!")
}
}
}
我现在解决了我的问题如下: ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ...
final class Singleton{
private init(){ }
static let shared = Singleton()
var someInt: Int = Int()
}
所以我宣布单身。
下一步:
第二个VC:
class ViewControllerTwo: UIViewController{
[...]
override func viewDidLoad() {
super.viewDidLoad()
let integer = Singleton.shared.someInt
print("We're in Class: SecondVC and Singleton.shared.someInt = \(integer).\n")
Singleton.shared.someInt = 5
if Singleton.shared.someInt == 5{
print("Singleton.shared.someInt changed to 5 in Class SecondVC.\n")
}
}
}
我的故事板如下所示:
如果有任何错误,请告诉我,但它对我有效
我还找到了另一个帮助链接:
您可以通过代码创建一个序列返回到view controller 1并传递数据,或者您可以创建一个类并编辑一个类,因为类是引用类型,在一个位置更改它将在另一个位置更改它。如果按下按钮时ViewController1对象仍在内存中,您可以向它发送通知,并将数据附加为通知对象或用户信息字典。实际上,有很多方法可以做到这一点。你可以使用通知、委托、单例类……好的,谢谢大家,我会看一看,找到最佳解决方案后给你们回信。酷,谢谢,我没有得到第8行(viewController.someButtonTappedHandler={[weak self]'…),但我会试试!@t.Meyer“我没有得到第8行”-在第8行中,你是软弱的
self
。你不应该在块内使用强引用。好的-明白了;-)嗯,我必须使用什么样的序列?目前,总是有一个运行时错误,说由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u Wins.gameoptioncontroller startNewGame:]:无法识别的选择器已发送到实例0x7fceb663c530'MuravevThanks感谢您的帮助,我现在使用Singleton解决了此问题。在下面添加了我的答案。