Swift: 我的目标 VC segue 显示为 nil
Swift: my destinationVC segue is showing nil
我让用户通过文本字段(姓名、电子邮件等)填写一些个人资料信息,这些信息用于设置我的 ProfileContoller.shared.profile 值。当我到达我的导航 segue 以传递数据时,我的 destinationVC.profile 不会将其值设置为发送配置文件对象,而是我得到 nil。
我的 sendingVC 嵌入了导航控制器,而我的 destinationVC 嵌入了 Tab Bar 控制器。
Segue SendingVC
Attributes Inspector SendingVC
DestinationVC
// Sending View Controller:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let profile = ProfileController.shared.profile else { return }
if segue.identifier == "signUpMemicTBC" {
let destinationVC = segue.destination as? ProfileViewController
destinationVC?.profile = profile
// Receiving ProfileViewController:
class ProfileViewController: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var fullNameLabel: UILabel!
@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!
// MARK: - Landing Pad
var profile : Profile? {
didSet {
updateViews()
}
}
override func viewDidLoad() {
super.viewDidLoad()
updateViews()
}
func updateViews () {
guard let profile = profile else { return }
fullNameLabel.text = profile.firstName + " " + profile.lastName
usernameLabel.text = profile.username
emailLabel.text = profile.email
}
}
// ProfileController:
class ProfileController {
// MARK: - Properties
var profile : Profile?
// MARK: - Singleton
static let shared = ProfileController()
}
我的发送对象有数据:
(lldb) po 配置文件
配置文件:0x600000c873c0
目标对象意外地为零:
(lldb) po destinationVC?.profile
无
didSet
在您的 vc in segue 尚未加载时触发,因此所有出口均为 nil
你需要把updateViews()
放在viewDidLoad
里面
另外你的目的地是一个 tabBar
let tab = segue.destination as! UITabBarController
let destinationVC = tab.viewControllers![2] as! ProfileViewController
我想你所要做的就是在主线程中调用 updateViews()
。
didSet {
print("did set profile called")
DispatchQueue.main.async{[weak self] in
guard let self = self else {
return
}
self.updateViews()
}
}
另一种选择是更新 viewDidLoad()
中的视图
override func viewDidLoad() {
if let prof = self.profile {
self.updateViews()
}
}
您可以使用以下代码将数据安全地传递到 ProfileViewController
。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let profile = ProfileController.shared.profile else { return }
if segue.identifier == "signUpMemicTBC" {
guard let tabBarController = segue.destination as? UITabBarController else { return }
guard let profileController = tabBarController.viewControllers?.index(at: 2) as? ProfileViewController else {
return
}
profileController.profile = profile
}
}
我让用户通过文本字段(姓名、电子邮件等)填写一些个人资料信息,这些信息用于设置我的 ProfileContoller.shared.profile 值。当我到达我的导航 segue 以传递数据时,我的 destinationVC.profile 不会将其值设置为发送配置文件对象,而是我得到 nil。
我的 sendingVC 嵌入了导航控制器,而我的 destinationVC 嵌入了 Tab Bar 控制器。
Segue SendingVC
Attributes Inspector SendingVC
DestinationVC
// Sending View Controller:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let profile = ProfileController.shared.profile else { return }
if segue.identifier == "signUpMemicTBC" {
let destinationVC = segue.destination as? ProfileViewController
destinationVC?.profile = profile
// Receiving ProfileViewController:
class ProfileViewController: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var fullNameLabel: UILabel!
@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!
// MARK: - Landing Pad
var profile : Profile? {
didSet {
updateViews()
}
}
override func viewDidLoad() {
super.viewDidLoad()
updateViews()
}
func updateViews () {
guard let profile = profile else { return }
fullNameLabel.text = profile.firstName + " " + profile.lastName
usernameLabel.text = profile.username
emailLabel.text = profile.email
}
}
// ProfileController:
class ProfileController {
// MARK: - Properties
var profile : Profile?
// MARK: - Singleton
static let shared = ProfileController()
}
我的发送对象有数据: (lldb) po 配置文件 配置文件:0x600000c873c0
目标对象意外地为零: (lldb) po destinationVC?.profile 无
didSet
在您的 vc in segue 尚未加载时触发,因此所有出口均为 nil
你需要把updateViews()
放在viewDidLoad
里面
另外你的目的地是一个 tabBar
let tab = segue.destination as! UITabBarController
let destinationVC = tab.viewControllers![2] as! ProfileViewController
我想你所要做的就是在主线程中调用 updateViews()
。
didSet {
print("did set profile called")
DispatchQueue.main.async{[weak self] in
guard let self = self else {
return
}
self.updateViews()
}
}
另一种选择是更新 viewDidLoad()
override func viewDidLoad() {
if let prof = self.profile {
self.updateViews()
}
}
您可以使用以下代码将数据安全地传递到 ProfileViewController
。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let profile = ProfileController.shared.profile else { return }
if segue.identifier == "signUpMemicTBC" {
guard let tabBarController = segue.destination as? UITabBarController else { return }
guard let profileController = tabBarController.viewControllers?.index(at: 2) as? ProfileViewController else {
return
}
profileController.profile = profile
}
}