Ios 将变量从ViewController传递回上一个,但不更新变量?
我有两个视图控制器,我感兴趣的是以向后的方式将变量从一个视图控制器传递到下一个视图控制器。为了实现这一点,我使用了一个协议,但是,当从视图控制器2返回到视图控制器1时,第一个视图控制器中的变量没有更新: 以下是我的第一个视图控制器代码:Ios 将变量从ViewController传递回上一个,但不更新变量?,ios,swift,protocols,Ios,Swift,Protocols,我有两个视图控制器,我感兴趣的是以向后的方式将变量从一个视图控制器传递到下一个视图控制器。为了实现这一点,我使用了一个协议,但是,当从视图控制器2返回到视图控制器1时,第一个视图控制器中的变量没有更新: 以下是我的第一个视图控制器代码: import UIKit class BlueBookUniversalBeamsVC: UIViewController { var lastSelectedTableRowByTheUser: Int = 0
import UIKit
class BlueBookUniversalBeamsVC: UIViewController {
var lastSelectedTableRowByTheUser: Int = 0
var lastSelectedTableSectionByTheUser: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
print(lastSelectedTableRowByTheUser)
print(lastSelectedTableSectionByTheUser)
}
}
extension BlueBookUniversalBeamsVC: ProtocolToPassDataBackwardsFromDataSummaryVcToPreviousVc {
func dataToBePassedUsingProtocol(passedSelectedTableSectionNumberFromPreviousVc: Int, passedSelectedTableRowNumberFromPreviousVc: Int) {
self.lastSelectedTableRowByTheUser = passedSelectedTableRowNumberFromPreviousVc
self.lastSelectedTableSectionByTheUser = passedSelectedTableSectionNumberFromPreviousVc
print("Last selected row passed back from SummaryVC is equal to \(passedSelectedTableRowNumberFromPreviousVc)")
print("Last selected section passed back from SummaryVC is equal to \(passedSelectedTableSectionNumberFromPreviousVc)")
}
下面是我在第二个视图控制器中的代码
import UIKit
class BlueBookUniversalBeamDataSummaryVC: UIViewController {
var delegate: ProtocolToPassDataBackwardsFromDataSummaryVcToPreviousVc?
@objc func navigationBarLeftButtonPressed(sender : UIButton) {
let main = UIStoryboard(name: "Main", bundle: nil)
let previousViewControllerToGoTo = main.instantiateViewController(withIdentifier: "BlueBookUniversalBeamsVC")
if delegate != nil {
delegate?.dataToBePassedUsingProtocol(passedSelectedTableSectionNumberFromPreviousVc: self.selectedTableSectionNumberFromPreviousViewController, passedSelectedTableRowNumberFromPreviousVc: self.selectedTableRowNumberFromPreviousViewController)
}
self.present(previousViewControllerToGoTo, animated: true, completion: nil)
}
}
奇怪的是,在Xcode控制台中,当我从VC2返回到VC1时,在VC1中的协议函数扩展中,我可以看到正确打印的值。但是,当从内部打印值时,它们都显示为0。知道为什么会发生这种情况吗?我在这里遗漏了什么吗?您的第二个视图控制器正在实例化第一个视图控制器的新实例,而不是使用已经存在的实例。第二个视图控制器不应再次显示第一个视图控制器,而应根据第一个视图控制器的显示或推送,将其重新显示
顺便说一下,指向第一个视图控制器的第二个视图控制器的
委托
属性应该是弱
属性。您永远不希望子对象维护对父对象的强引用。此外,代理几乎总是很弱…您的第二个视图控制器正在实例化第一个视图控制器的新实例,而不是使用已经存在的实例。第二个视图控制器不应再次显示第一个视图控制器,而应根据第一个视图控制器的显示或推送,将其重新显示
顺便说一下,指向第一个视图控制器的第二个视图控制器的
委托
属性应该是弱
属性。您永远不希望子对象维护对父对象的强引用。此外,代表们几乎总是软弱的……非常感谢您出色而准确的回答,解决了我的问题:)非常感谢您出色而准确的回答,解决了我的问题:)无关,if delegate!=不需要nil{…}
。delegate?.dataToBePassedUsingProtocol(…)
的可选链接已经优雅地测试委托是否为nil
。不相关的是if delegate!=不需要nil{…}
。delegate?.dataToBePassedUsingProtocol(…)
的可选链接已经优雅地测试委托是否为nil
。