ios 从childViewController访问ParentViewController

67up9zun  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(56)

我需要从childViewController访问在ParentViewController中声明的按钮。下面是我的代码,但不工作。父视图的示例没有在其中获取值。请问我做错了什么?

override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
   
        if (indexPath.row == (productDetailViewModel.count) - 1 ) { //it's your last cell
            //Load more data & reload your collection view
            if let parent = self.navigationController?.parent as? ProductTypeVCont {

                parent.btnRight.isHidden = true
                parent.btnLeft.isHidden = false
               }
            print("scroll at end")
        } else if (indexPath.row == 0 ) {
            print("scroll at begining")
            if let parent = self.navigationController?.parent as? ProductTypeVCont {

                parent.btnRight.isHidden = false
                parent.btnLeft.isHidden = true
               }
          
        } else if (indexPath.row > 1 || indexPath.row == (productDetailViewModel.count) - 1 ) {
            print("scrolling")
            if let parent = self.navigationController?.parent as? ProductTypeVCont {
                
                parent.btnRight.isHidden = false
                parent.btnLeft.isHidden = false
               }
           
        }
}

父变量在任何情况下都没有得到值。我看了很多问题,但答案是过时的或不符合标准或不完整,因此再次张贴这个问题。

b1uwtaje

b1uwtaje1#

您没有提供视图层次结构,所以我将根据如何使用父子视图控制器的最典型方式来回答这个问题。在示例代码中,我可以看到您正在调用self.navigationController?.parent来访问子视图控制器的父视图控制器。但是,您只需要调用self.parent来获取管理这个子视图控制器的容器视图控制器。
所以你可以在代码中这样做:

if let parentVC = self.parent as? ProductTypeVCont {
     parentVC.btnRight.isHidden = false
     ...
}

因为我们不知道你的视图层次结构是什么,所以不清楚你所指的“父”是什么。您可能实际上想要访问呈现视图控制器。在这种情况下,您将使用self.presentingViewController而不是self.parent。以下是关于parent view controllerpresenting view controller的一些额外信息。
最后,通常最好在子视图控制器和父视图控制器中保持逻辑分离。在示例代码中,现在子视图控制器依赖于ProductTypeVCont类型。您可以使用经典的委托模式或基于事件的体系结构来删除这种依赖关系。有很多out there的例子来说明如何实现这些。这只是一个关于如何创建松散耦合应用程序的建议。

相关问题