我有一个类,其中定义了一个CollectionView,用作自定义TabBar。它具有三个单元格,每个单元格代表另一个选项卡。当我选择一个标签页(因此是CollectionView的一个单元格)时,我想更新视图内标签的文本。
在tabs.swift中(所有的奇妙之处在于设置自定义标签栏),我添加了以下功能:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let uvController = UserViewController()
uvController.longLabel.text = "Test"
}
在UserViewController中,我这样称呼它:
let ProfileTabs: profileTabs = {
let tabs = profileTabs()
return tabs
}()
它显示了我想要的所有选项卡,但是当我选择它时,标签不会更新。但是,当我执行打印操作时,它确实会返回标签的值:
print(uvController.longLabel.text)
这将返回我在设置标签时定义的值,因此实际上我可以访问标签,但是它不会像我想要的那样进行更新。关于为什么没有发生任何见解?
答案 0 :(得分:2)
let uvController = UserViewController()
这是问题所在。
您实例化了一个新的UserViewController而不是引用您当前的UserViewController,以使标签不相同。您可以打印(UserViewController)以将其签出,地址应该不同。
我的建议是您可以在Tabs.swift中定义一个协议,并让您的UserViewController代表它,以接收更新操作。
同时,let ProfileTabs: profileTabs
也不是一个好的命名约定,通常自定义类应使用大写字母而不是变量。
答案 1 :(得分:1)
此行-let uvController = UserViewController()
创建一个UserViewController
的新实例,该实例不在屏幕上。您需要参考已经显示给用户的内容。您可以执行以下操作:
最快的方法。
只需在ProfileTabs
初始化程序中传递实例即可。像这样:
class ProfileTabs {
let parentViewController: UserViewController
init(withParent parent: UserViewController) {
self.parentViewController = parent
}
// and then change to :
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
parentViewController.longLabel.text = "Test"
}
}
更干净的方式。使用委托。
protocol ProfileTabsDelegate: class {
func profileTabs(didSelectTab atIndex: Int)
}
class ProfileTabs {
weak var delegate: ProfileTabsDelegate?
init(withDelegate delegate: ProfileTabsDelegate) {
self.delegate = delegate
}
// and then change to :
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
delegate?.profileTabs(didSelectTab: indexPath.item)
}
}
然后在UserViewController
extension UserViewController: ProfileTabsDelegate {
func profileTabs(didSelectTab atIndex: Int) {
longLabel.text = "Test"
}
}