【问题标题】:Swift: Help troubleshoot Segue data from one view to anotherSwift:帮助解决从一个视图到另一个视图的 Segue 数据故障
【发布时间】:2018-07-18 04:34:34
【问题描述】:

您好,我对 Swift 很陌生。我在 youtube 上观看了几个不同的视频和教程,但我无法确定我做错了什么。

我正在尝试从签到视图中获取数据并将其转移到摘要视图中。代码运行,我可以在应用程序中移动,但数据没有移动。下面是两个不同 swift 文件的代码。任何见解将不胜感激。

签到:

import Foundation
import UIKit

class VieNewCheckIN : UIViewController {

    @IBOutlet var SWR: UILabel!
    @IBOutlet var ModelNumber: UITextField!
    @IBOutlet var SerialNumber: UITextField!
    @IBOutlet var Notes: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let viewnewsummary = segue.destination as? ViewNewSummary else { return }
        viewnewsummary.NotesValue = Notes.text
        viewnewsummary.SerialNumberValue = SerialNumber.text
        viewnewsummary.ModelNumberValue = ModelNumber.text
    }
}

总结:

import Foundation
import UIKit

class ViewNewSummary : UIViewController {

    @IBOutlet var FirstNameLabel: UILabel!
    var FirstNameValue : String!
    @IBOutlet var LastNameLabel: UILabel!
    var LastNameValue : String!
    @IBOutlet var IDLabel: UILabel!
    var BaylorIDValue : String!
    @IBOutlet var EmailLabel: UILabel!
    var BaylorEmailValue : String!
    @IBOutlet var PhoneNumberLabel: UILabel!
    var PhoneNumberValue : String!
    @IBOutlet var ModelNumberLabel: UILabel!
    var ModelNumberValue : String!
    @IBOutlet var SerialNumberLabel: UILabel!
    var SerialNumberValue : String!
    @IBOutlet var NotesLabel: UILabel!
    var NotesValue : String!

    override func viewDidLoad() {
        super.viewDidLoad()

        FirstNameLabel.text = FirstNameValue
        LastNameLabel.text = LastNameValue
        BaylorIDLabel.text = BaylorIDValue
        BaylorEmailLabel.text = BaylorEmailValue
        PhoneNumberLabel.text = PhoneNumberValue
        ModelNumberLabel.text = ModelNumberValue
        SerialNumberLabel.text = SerialNumberValue
        NotesLabel.text = NotesValue
    }
}

【问题讨论】:

  • 我不确定您是否可以从prepare 访问字段/网点(我可能正在考虑另一种情况)。我倾向于做的是使用struct 来包装数据并将其分配给目标中的可选变量。当viewDidLoad (最终)被调用时,我检查该可选的状态,如果已设置,我将值应用于该点的字段
  • 我建议你在prepareviewDidLoad 中设置断点,然后单步执行你的代码,看看发生了什么

标签: ios swift xcode segue


【解决方案1】:
  1. 验证prepare(for:sender:)被调用,例如使用断点或print/caveman 调试;
  2. 验证ViewNewSummary.viewDidLoad()也被调用了;
  3. 验证prepareviewDidLoad 之前被调用。

我怀疑viewDidLoad 被调用之前 prepare(for:sender:) 被调用;这是有道理的,因为您需要一个初始化的视图控制器对象来准备 segue。

所以您需要添加 viewWillAppear(_:) 作为快速修复:

extension ViewNewSummary {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        FirstNameLabel.text = FirstNameValue
        LastNameLabel.text = LastNameValue
        BaylorIDLabel.text = BaylorIDValue
        BaylorEmailLabel.text = BaylorEmailValue
        PhoneNumberLabel.text = PhoneNumberValue
        ModelNumberLabel.text = ModelNumberValue
        SerialNumberLabel.text = SerialNumberValue
        NotesLabel.text = NotesValue
    }
}

如果这不适用于所有情况,您可能需要研究属性观察器,例如

var PhoneNumberValue : String! { 
    didSet {
        guard isViewLoaded else { return }
        PhoneNumberLabel.text = PhoneNumberValue
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多