当从另一个控制器(弹出窗口)访问UILabel(作为出口)时,它保持为零

时间:2018-12-24 09:10:10

标签: ios swift swift4

有2个控制器。 this is how the UI looks this is how I am creating the popup i.e. using segue

HomeViewController: 有一个标签和一个按钮。单击名为->“添加动作”->的按钮后,将弹出一个弹出窗口。

PopupViewController: 是一个弹出窗口,用户可以在其中输入输入并点击保存。在弹出窗口中,有一个文本字段。用户填写该字段,然后单击“保存”。 保存时->为此PopupViewController调用IBAction,它具有dismiss()函数以关闭弹出窗口。 我想实例化HomeViewController来更新标签的地方是dismiss函数中的完成块。 (注意:PopupViewController是通过segue通过选择当前上下文来创建的)

但是这样做的时候,我发现HomeViewController内部的所有IBOutlet在尝试从弹出窗口进行保存时都为零,因此我无法更新标签。

我尝试过的方法: 我已经检查了网上的其他问答,并在下面进行了验证: 1.我已经检查了标签与故事板的连接。这是正确的。 2.为了实例化,我使用了instantiateViewController语法 HomeViewController正确。 但问题仍然存在。

HomeViewController

var actionNames = [String]()
var actionDescriptions = [String]()
@IBOutlet weak var firstActionLabel: UILabel!

func updateViewWithNewAction() {
    print("updating views started")
    if firstActionLabel != nil {
        if actionNames.count > 0 {
            firstActionLabel.text = actionNames[0]
        } else {
            print("no actions in the array")
        }
    } else {
        print("firstActionLabel is nil")
    }
    print("updating views completed")
}

func addActions(actionName: String, actionDescription: String) {
    actionNames.append(actionName)
    actionDescriptions.append(actionDescription)
    print("actions added")
}

PopupViewController

@IBOutlet weak var actionTitle: UITextField!
@IBOutlet weak var actionDescriptionTextView: UITextView!
@IBAction func createAction(_ sender: Any) {
    //getting action values from user
    actionName = actionTitle.text!
    actionDescription = actionDescriptionTextView.text!

    dismiss(animated: true, completion: {
        print("completion block started ---")
        let homeVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController

        homeVC.addActions(actionName: self.actionName, actionDescription: self.actionDescription)
        homeVC.updateViewWithNewAction()
        print("completion block ended ---")
    })
}

预期结果:在PopupViewController的createAction()上,应使用新值更新HomeViewController内部的标签。 实际结果:在homeVC.updateViewWithNewAction()期间,firstActionLabel为零

2 个答案:

答案 0 :(得分:0)

这样做

class HomeViewController: UIViewcontroller {

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

问题在于,直到viewDidLoadIBOutlet中的任何一个都不会被初始化。他们应该通过情节提要进行初始化。直到viewDidLoad,您才能获得任何参考。

如果您不想每次都呼叫updateViewWithNewAction(),请添加一个Bool标志来决定呼叫还是不呼叫updateViewWithNewAction()。只要需要,就可以在Bool或其他任何地方设置PopUpViewController标志。

答案 1 :(得分:0)

基本上我认为您想要这样的东西:

添加HomeViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let popupViewController = segue.destination as? PopupViewController {
        popupViewController.callback = self.addActions
    }
}

然后在PopupViewController中添加

var callback: ((String, String) -> Void)?

然后在PopupViewController中更改

@IBAction func createAction(_ sender: Any) {
    //getting action values from user
    actionName = actionTitle.text!
    actionDescription = actionDescriptionTextView.text!

    dismiss(animated: true, completion: {
        callback?(self.actionName, self.actionDescription)
    })
}