如何将 ViewController 之间的数据更改为一个动作?
How can I change the data between ViewControllers as an action?
我在将数据作为动作在 ViewController 之间传递时遇到问题。这意味着以下内容:
ViewController1 - NavigationControllers, etc. - ...
|
|
ViewController2 - - - - - - ...
所以我有两个 ViewController。 ViewController1 有一个变量(比方说 var myName:String = "Joana")
我想通过单击 ViewController2 中的按钮来更改它。
我的问题是:我该怎么做(我知道如何在通过 segue 直接连接但不与操作结合的 VC 之间传递数据,这是我的问题)?
我听说过 prepare(for segue: UIStoryboardSegue, sender: Any?),但我认为它只有在两个 VC 之间存在一个 segue(直接)时才有效。
总结:
VC2: Button: action -> change var 'myname' on VC1 to 'hello', no direct segue.
提前感谢您的帮助! :-)
看看:
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!")
}
}
}
我现在解决了我的问题如下:
final class Singleton{
private init(){ }
static let shared = Singleton()
var someInt: Int = Int()
}
所以我声明一个单例。
下一个:
class ViewControllerOne: UIViewController{
[Outlets,...]
override func viewDidLoad() {
super.viewDidLoad()
let integer = Singleton.shared.someInt
print("We're in Class: ViewController and Singleton.shared.someInt = \(integer).\n")
Singleton.shared.someInt = integer
myLabel.text = "\(Singleton.shared.someInt)"
}
}
第二个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")
}
}
}
我的故事板是这样的:
The storyboard
如果有任何错误,请告诉我,但这对我有用。
另一个 link 我也找到了帮助:
Help
我在将数据作为动作在 ViewController 之间传递时遇到问题。这意味着以下内容:
ViewController1 - NavigationControllers, etc. - ... | | ViewController2 - - - - - - ...
所以我有两个 ViewController。 ViewController1 有一个变量(比方说 var myName:String = "Joana") 我想通过单击 ViewController2 中的按钮来更改它。 我的问题是:我该怎么做(我知道如何在通过 segue 直接连接但不与操作结合的 VC 之间传递数据,这是我的问题)? 我听说过 prepare(for segue: UIStoryboardSegue, sender: Any?),但我认为它只有在两个 VC 之间存在一个 segue(直接)时才有效。 总结:
VC2: Button: action -> change var 'myname' on VC1 to 'hello', no direct segue.
提前感谢您的帮助! :-)
看看:
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!")
}
}
}
我现在解决了我的问题如下:
final class Singleton{
private init(){ }
static let shared = Singleton()
var someInt: Int = Int()
}
所以我声明一个单例。 下一个:
class ViewControllerOne: UIViewController{
[Outlets,...]
override func viewDidLoad() {
super.viewDidLoad()
let integer = Singleton.shared.someInt
print("We're in Class: ViewController and Singleton.shared.someInt = \(integer).\n")
Singleton.shared.someInt = integer
myLabel.text = "\(Singleton.shared.someInt)"
}
}
第二个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")
}
}
}
我的故事板是这样的:
The storyboard
如果有任何错误,请告诉我,但这对我有用。
另一个 link 我也找到了帮助:
Help