【问题标题】:Delegate change from child view to main view委托从子视图到主视图的更改
【发布时间】:2019-05-02 08:00:06
【问题描述】:

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

我添加的孩子

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

我正在尝试通过委托来执行此操作 在子视图中:

protocol UserDelegate {
    func changeName(name: String)
}

class ChildView: UIViewController {

     var userDelegate: UserDelegate?

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

在主视图中:

class MainView: UIViewController, UserDelegate {

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

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

【问题讨论】:

  • 加断点检查了吗?你的 changename 函数是否触发?
  • @ShauketSheikh,是的,我已检查 - 未触发
  • 表示委托有问题。你为什么要加这个? self.addChild(to) 之后您将添加到主视图中。在该子视图有两个父视图之后。
  • 顺便说一句,你的问题在这里 let ChildView = ChildView() 你的委托与这个对象绑定,你应该被称为其他对象委托
  • @ShauketSheikh 谢谢!!

标签: swift uiviewcontroller delegates childviewcontroller


【解决方案1】:

问题是您提供了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 实现:

class MainView: UIViewController, UserDelegate {
    // this should be enough
    func changeName(name: String) {
        self.helloLabel.text = "Hello \(name)!"
    }
}

【讨论】:

  • 同样在MainView 中,这个let ChildView = ChildView() ChildView.userDelegate = self 是不必要的。可以删除。
  • @Milan Nosáľ 谢谢!!
猜你喜欢
  • 2017-12-11
  • 2018-04-05
  • 2013-07-04
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多