【发布时间】:2020-03-20 17:15:58
【问题描述】:
我的委托模式有效(如果我的委托函数只需要打印关于传回数据的语句)(程序化布局,没有 IB segues)。但是接收器类不会相应地更新其 UI。这——我相信——结束了这个案例,即我的委托模式是错误的。 我的 UI 怎么可能没有更新?什么情况下通常会阻止这种情况?我在这里处理手动输入,没有网络调用,没有大量数据或类似的东西。 例如我的委托函数是:
class DetailTableViewController: AddVCDelegate {
//delegate function of AddVCDelgate protocol
func didAddLesson(lesson: Lesson) { // my addVC is calling this through delegate
self.lesson = lesson
print("delegate function set navitem title: \(lesson.name!)")//printed out correctly
self.navigationItem.title = lesson.name! //nothing changes
self.tableView.reloadData()// no reload
}
/*Here lesson.name got printed out nicely, navigationItem title does not change accordingly , tableView does not reload data.*/
返回 AddVC ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
let vc = DetailTableViewController()
self.delegate = vc //etc..}
AddVC 使用这个函数:
func passLesson() {
if let lesson = lesson,
let delegate = self.delegate {
delegate.didAddLesson(lesson: lesson)
}
}
我只是发布了这个小sn-p,因为现在项目有点太复杂,无法复制到这里,但我相信这是问题代码的相关部分。如果需要,我可以更新更多细节。提前致谢!
更新:我已将一个简单的演示项目上传到 GitHub,它正在重现该问题,我希望它有助于了解问题的真正原因。我还在拼命寻找,我在这里做错了什么。
【问题讨论】:
-
显示如何在调用
didAddLesson的对象上设置委托。最常见的错误是没有在视图控制器的屏幕实例上调用委托方法。 -
更新了代码。
-
@Paulw11,AddVC 她已经是导航堆栈上的第三个,因为我有一个 mainVC presentig detailVC,它正在展示 addVC 进行修改。可能是某种问题吗?
-
有趣的文章。我认为理解这个概念。然而类是引用类型,所以如果你使一个彼此相等,它们将被引用。我不知道的一点是,通过告诉视图控制器类“你们两个在同一个导航堆栈上”已经足以实现这一点。请纠正我,如果我在这里错了。
标签: ios swift user-interface delegates uikit