选择UICollectionViewCell

时间:2018-10-19 09:36:05

标签: ios swift uicollectionview uilabel

我有一个类,其中定义了一个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)

这将返回我在设置标签时定义的值,因此实际上我可以访问标签,但是它不会像我想要的那样进行更新。关于为什么没有发生任何见解?

2 个答案:

答案 0 :(得分:2)

let uvController = UserViewController()

这是问题所在。

您实例化了一个新的UserViewController而不是引用您当前的UserViewController,以使标签不相同。您可以打印(UserViewController)以将其签出,地址应该不同。

我的建议是您可以在Tabs.swift中定义一个协议,并让您的UserViewController代表它,以接收更新操作。

同时,let ProfileTabs: profileTabs也不是一个好的命名约定,通常自定义类应使用大写字母而不是变量。

答案 1 :(得分:1)

此行-let uvController = UserViewController()创建一个UserViewController的新实例,该实例不在屏幕上。您需要参考已经显示给用户的内容。您可以执行以下操作:

  1. 最快的方法。 只需在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"
    
        }
    }
    
  2. 更干净的方式。使用委托。

    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"
        }
    }