将变量从 ViewController 传回前一个,但变量没有更新?
Passing variables back from a ViewController to a previous one, but variables not updating?
我有两个视图控制器,我有兴趣以向后的方式将变量从一个视图控制器传递到下一个视图控制器。为了实现这一点,我使用了一个协议,但是,当从视图控制器二返回到视图控制器一时,第一个视图控制器中的变量没有更新:
下面是第一个视图控制器的代码:
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)")
}
下面是我在第二个视图控制器中的代码L
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)
}
}
奇怪的是,当我从 VC2 返回到 VC1 时,在 Xcode 控制台中,在 VC1 的协议功能扩展中,我可以看到正确打印的值。但是,当从 viewDidLoad()
内部打印值时,它们都显示为 0。知道为什么会发生这种情况,我在这里遗漏了什么吗?
您的第二个视图控制器正在实例化第一个视图控制器的新实例,而不是使用已经存在的实例。第二个视图控制器不应该再次present
第一个视图控制器,而是dismiss
(或pop
)回到它,这取决于第一个呈现或推送给它。
顺便说一句,指向第一个视图控制器的第二个视图控制器的 delegate
属性 应该是 weak
属性。您永远不希望子对象保持对父对象的强引用。此外,代表们几乎总是弱者...
我有两个视图控制器,我有兴趣以向后的方式将变量从一个视图控制器传递到下一个视图控制器。为了实现这一点,我使用了一个协议,但是,当从视图控制器二返回到视图控制器一时,第一个视图控制器中的变量没有更新:
下面是第一个视图控制器的代码:
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)")
}
下面是我在第二个视图控制器中的代码L
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)
}
}
奇怪的是,当我从 VC2 返回到 VC1 时,在 Xcode 控制台中,在 VC1 的协议功能扩展中,我可以看到正确打印的值。但是,当从 viewDidLoad()
内部打印值时,它们都显示为 0。知道为什么会发生这种情况,我在这里遗漏了什么吗?
您的第二个视图控制器正在实例化第一个视图控制器的新实例,而不是使用已经存在的实例。第二个视图控制器不应该再次present
第一个视图控制器,而是dismiss
(或pop
)回到它,这取决于第一个呈现或推送给它。
顺便说一句,指向第一个视图控制器的第二个视图控制器的 delegate
属性 应该是 weak
属性。您永远不希望子对象保持对父对象的强引用。此外,代表们几乎总是弱者...