CollectionViewController

CollectionViewController

我试图根据在ListViewController中选择的行来更改navigationItem.titleViewCollectionViewController。我正在尝试使用委托方法来执行此操作,但是它不起作用。 didSelectRowAt被调用,但是func changeTitleView永远不会被调用。我不知道怎么了。当我在func changeTitleView中使用CollectionViewController并在其自己的类中使用它时,它可以工作,所以我知道该函数正在工作。我只是不确定如何将从String中选择的CollectionVC数据传递给ListVC。我对委托方法非常陌生。

全局变量:

var selectedCollection: CollectionItem?

CollectionViewController:

protocol HandleTitleView {
  func doesThisWork(answer: String)
}

class CollectionViewController: UITableViewController {

  var handleTitleViewDelegate: HandleTitleView? = nil

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedItem = collections[indexPath.row]
    selectedCollection = selectedItem
    let title = selectedCollection?.collectionTitle

    handleTitleViewDelegate?.doesThisWork(answer: title!)
  }
}


ListViewController:

class ListViewController: UITableViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // set up the collectionViewDelegate
    let collectionViewController = storyboard?.instantiateViewController(withIdentifier: "CollectionViewController") as! CollectionViewController
    collectionViewController.titleView = titleLabel
    collectionViewController.handleTitleViewDelegate = self
}

extension ListViewController: HandleTitleView {

  func doesThisWork(answer: String) {
    print(answer)

  }

}


感谢您能为我提供的任何帮助。提前致谢。

更新

我正在通过名为CollectionViewController的侧菜单实例化MenuTableViewController。我现在意识到我需要链接委托方法,但是CollectionViewController嵌入在导航栏中,因此当我实例化它时,我必须实例化CollectionViewControllerNav并且无法将MenuTableViewController设置为CollectionVC委托:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    switch indexPath.row {

    case 0:

            let collectionViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CollectionViewController") as! CollectionViewController
            collectionViewController.handleTitleViewDelegate = self

            let collectionViewControllerNav = storyboard?.instantiateViewController(withIdentifier: "CollectionViewControllerNav")
            self.present(collectionViewControllerNav!, animated: true, completion: nil)


在这种情况下,我不确定如何设置委托方法

更新

当我呈现CollectionViewController而不是其CollectionViewControllerNav对应对象时,委托方法有效

最佳答案

扩展不能/不应覆盖。

如Apple的Swift指南中所述,无法覆盖扩展中的功能(如属性或方法)。

Extensions can add new functionality to a type, but they cannot override existing functionality.
Apple Developer Guide


编译器允许您重写扩展名以与Objective-C兼容。但这实际上违反了语言指令。

而不是为didSelectrow扩展CollectionViewcontroller。你应该暗示didSelectRow方法是CollectionViewController

关于ios - 委托(delegate)方法来更改navigationItem.titleView不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46629365/

10-13 03:51