委托从子视图到主视图的更改

时间:2019-05-02 08:00:07

标签: swift uiviewcontroller delegates childviewcontroller

我有带有mainView和ChildView的UIViewController。 我想从ChildView更改mainView中的标签

enter image description here

我添加的孩子

let to = ChildView()
self.addChild(to)
self.mainView.addSubview(to.view)
self.mainViewConstraint.constant = to.view.frame.height
to.view.frame = self.mainView.bounds
to.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

mainView-其视图,其中显示childView

我正在尝试与委托进行此操作 在ChildView中:

protocol UserDelegate {
    func changeName(name: String)
}

class ChildView: UIViewController {

     var userDelegate: UserDelegate?

    @IBAction func changeNameBtn(_ sender: UIButton) {
        self.userDelegate?.changeName(name: "TestChanges")
    }
}

在MainView中:

class MainView: UIViewController, UserDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        let ChildView = ChildView()
        ChildView.userDelegate = self
    }

    func changeName(name: String) {
        self.helloLabel.text = "Hello \(name)!"
    }
}

1 个答案:

答案 0 :(得分:1)

问题是您呈现 Dim newList As New List(Of String) newList.AddRange(strValues.Where(Function(a) a.ToLower.StartsWith("netsh"))) newList.AddRange(strValues.Where(Function(a) a.ToLower.StartsWith("net use"))) newList.AddRange(strValues.Where(Function(a) a.ToLower.StartsWith("netsh") = False AndAlso a.ToLower.StartsWith("net use") = False)) 的一个实例,并在ChildView的另一个实例上设置了一个委托。因此,屏幕上显示的子视图与调用委托的视图不同。添加ChildView时设置委托:

ChildView

此外,为防止保留周期,请使用对委托的let to = ChildView() self.addChild(to) self.mainView.addSubview(to.view) self.mainViewConstraint.constant = to.view.frame.height // set the delegate here to.userDelegate = self.mainView to.view.frame = self.mainView.bounds to.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 引用:

weak

最后,您可以从主视图中删除protocol UserDelegate: AnyObject { func changeName(name: String) } class ChildView: UIViewController { weak var userDelegate: UserDelegate? @IBAction func changeNameBtn(_ sender: UIButton) { self.userDelegate?.changeName(name: "TestChanges") } } 实现:

viewDidLoad