在没有segue的情况下将数据传递到Swift中的ViewController

时间:2018-10-27 07:23:56

标签: swift

我有两个控制器。一个只是一个弹出框。它是一个带有透明背景的小矩形。

我在第二个Controller中有一个Tableview,并且想要通过在第二个Controller中选择一个TableView Raw来更改我的第一个Controller中的TextField。

有可能吗?这是我的第一个Controller中创建第二个Controller / CategoryViewController的方法:

@IBAction func showCategoryPopup(_ sender: Any) {
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "categoryVC") as! CategoryViewController
        self.addChild(popOverVC)
        popOverVC.view.frame = self.view.frame
        self.view.addSubview(popOverVC.view)
        popOverVC.didMove(toParent: self)
    }

这是将在第二个Controller中创建Popover的方法:

func showAnimate() {
        self.view.transform = CGAffineTransform.init(scaleX: 1.3,y:1.3)
        self.view.alpha = 0.0
        UIView.animate(withDuration: 0.25) {
            self.view.alpha = 1.0
            self.view.transform = CGAffineTransform.init(scaleX: 1.0,y:1.0)
        }
    }

    func removeAnimate() {
        UIView.animate(withDuration: 0.25, animations: {
            self.view.transform = CGAffineTransform.init(scaleX: 1.3,y:1.3)
            self.view.alpha = 0.0
        }) { (finished: Bool) in
            if(finished) {
                self.view.removeFromSuperview()
            }
        }
    }

如何从第二个控制器呼叫我的第一个控制器?我尝试过这种方式:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.row)

//        let myVC = storyboard?.instantiateViewController(withIdentifier: "changeBalanceCtrl") as! ChangeBalanceViewController

        let firstVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "changeBalanceCtrl") as! ChangeBalanceViewController


        firstVC.changeBalanceTextField.text! = "TEST"

    }

我认为问题在于第一个Controller changeBalanceTextField.text为nil。 我检查了“自我”参数,然后得到了两个不同的对象。因此,我认为与第二个Controller一起构建的第一个Controller是不同的控制器。

1 个答案:

答案 0 :(得分:2)

在表视图委托中使用instantiateViewController(withIdentifier:)的操作是创建ChangeBalanceViewController的新实例。要访问第二个视图控制器的实际父级,您需要在第二个视图控制器中使用self.parent

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let firstVC = self.parent as? ChangeBalanceViewController {
        firstVC.changeBalanceTextField.text = "TEST"
    }
}