委托方法 Swift 无法正常工作
Delegate Method Swift not working correctly
我正在尝试让我的视图控制器相互通信并传递可以相互更改的值。在这种特殊情况下,我试图将一个值从第一个控制器传递到第二个控制器,更改第二个控制器中的值,然后将值从第二个控制器传递回第一个控制器。我可以执行第 1 步和第 2 步,但是第 3 步不起作用,当我尝试获取更改后的值时,它在到达 viewDidLoad() 时没有更改。这是示例代码:
//first controller
class OpenViewController: UIViewController, UpdateDelegate {
var text: String!
func save(controller: ViewController, text2: String) {
text = text2//set the new value of text to text2
controller.navigationController?.popViewControllerAnimated(true)
println(text)
}
override func viewDidLoad() {
super.viewDidLoad()
if(text.isEmpty) { //if text is empty set value to hi
text = "hi"
}
else{
print(text)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToList" {
var vc = segue.destinationViewController as! ViewController
vc.text2 = text
vc.delegate = self
}
}
}
}
//second controller
protocol UpdateDelegate{
func save(controller: ViewController, text2: String)
}
class ViewController: UIViewController {
var delegate: UpdateDelegate? = nil
var text2: String!
@IBAction func home(sender: AnyObject) { //button click to go back to first view controller
delegate!.save(self, text2: String) //save the updated value into first view controller
}
override func viewDidLoad() {
super.viewDidLoad()
self.text2 = text! //set value of text2 to the value of text from previous view controller
self.text2 = "bye"//change text2 value to "bye"
}
}
打印语句用于检查它是否按预期工作。保存函数中的 println(text) 实际上显示 text 的值已更改为 text2,但是当它到达 OpenViewController 中的 viewDidLoad() 时,text 现在再次为空。我对 with delegate 的印象是,OpenViewController 中文本的值将是 ViewController.
中的文本 2
一般来说,您可能不想让 ViewController 直接相互对话。
您想要的是长期存在且两个 ViewController 都可以与之通信的第三个实体。我们暂时将此称为 TextManager。
因此 OpenViewController 调用 TextManager 来设置其他 UIViewController 可能需要的文本。然后您的第二个 UIViewController 也可以与 TextManager 对话以检索文本。同样,它可以将第一个 viewController 可以读取的更改发送到 TextManager。
UIViewController 不会存在很长时间 - 它们来来去去。所以你需要第三件事来处理你长期存在的数据。
我正在尝试让我的视图控制器相互通信并传递可以相互更改的值。在这种特殊情况下,我试图将一个值从第一个控制器传递到第二个控制器,更改第二个控制器中的值,然后将值从第二个控制器传递回第一个控制器。我可以执行第 1 步和第 2 步,但是第 3 步不起作用,当我尝试获取更改后的值时,它在到达 viewDidLoad() 时没有更改。这是示例代码:
//first controller
class OpenViewController: UIViewController, UpdateDelegate {
var text: String!
func save(controller: ViewController, text2: String) {
text = text2//set the new value of text to text2
controller.navigationController?.popViewControllerAnimated(true)
println(text)
}
override func viewDidLoad() {
super.viewDidLoad()
if(text.isEmpty) { //if text is empty set value to hi
text = "hi"
}
else{
print(text)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToList" {
var vc = segue.destinationViewController as! ViewController
vc.text2 = text
vc.delegate = self
}
}
}
}
//second controller
protocol UpdateDelegate{
func save(controller: ViewController, text2: String)
}
class ViewController: UIViewController {
var delegate: UpdateDelegate? = nil
var text2: String!
@IBAction func home(sender: AnyObject) { //button click to go back to first view controller
delegate!.save(self, text2: String) //save the updated value into first view controller
}
override func viewDidLoad() {
super.viewDidLoad()
self.text2 = text! //set value of text2 to the value of text from previous view controller
self.text2 = "bye"//change text2 value to "bye"
}
}
打印语句用于检查它是否按预期工作。保存函数中的 println(text) 实际上显示 text 的值已更改为 text2,但是当它到达 OpenViewController 中的 viewDidLoad() 时,text 现在再次为空。我对 with delegate 的印象是,OpenViewController 中文本的值将是 ViewController.
中的文本 2一般来说,您可能不想让 ViewController 直接相互对话。
您想要的是长期存在且两个 ViewController 都可以与之通信的第三个实体。我们暂时将此称为 TextManager。
因此 OpenViewController 调用 TextManager 来设置其他 UIViewController 可能需要的文本。然后您的第二个 UIViewController 也可以与 TextManager 对话以检索文本。同样,它可以将第一个 viewController 可以读取的更改发送到 TextManager。
UIViewController 不会存在很长时间 - 它们来来去去。所以你需要第三件事来处理你长期存在的数据。