1

私はUICollectionViewCellクラス "ProductCell"を持っています。私はbarbuttoniconを更新するために現在のナビゲーションコントローラにアクセスしようとしています。Swift:UICollectionViewCellから現在のナビゲーションコントローラにアクセス

let nav = self.navigationController as! MFNavigationController 
    nav.updateCartBadgeValue() 

それはタイプProductCellの

値は何のメンバーnavigationController

Iを持っていないと述べているしかし:これは私が私の他のUIViewControllersに使用するものであるように私には、次のコードを試してみましたこれはUIViewControllerではないことを認識していますが、確かに同じ方法で現在のナビゲーションコントローラにアクセスできるはずですか?

私はまた、あなたが次のようにUIApplicationを使用してナビゲーションコントローラにアクセスできることを知っている:

let navigationController = application.windows[0].rootViewController as! UINavigationController 

私はそれはしかし、それを行うための良い方法であるかどうかわからないです。

物事が変化しない限り、すべてのヘルプは非常に

おかげ

+0

あなたは自分の質問にかなり答えました。それはかなりではありませんが、いつも働いています。 – Mozahler

+1

コレクションビューとコレクションビューセルの背後にあるデザイン原則について考えてみましょう。セルは、通常、他の種類の状態またはアプリケーションロジックについて知る必要がない、無生物(データモデルの一部の静的な反射)です。 MVCパターン(私は思っていますが、それはかなりうまくいくと思います)では、コントローラ、つまりコレクションビューコントローラがそれを処理する必要があります。 – joeybladb

+0

ビューからコントローラにアクセスする必要があるときは、間違ったことをしています。コントローラー(UICollectionViewのコントローラー)からセルを構成する方法を見直してください。 –

答えて

0

最も簡単な方法は、あなたに弱く、あなたのcellForRow(atIndexPath:_)でそれを割り当てる必要がありますUINavigationController

weak var navigationController: UINavigationController? 

参照セルクラスプロパティを追加することである方法を。

let cell = tableView.dequeueReusableCell(withIdentifier: "yourReuseID") as! YourCellClass 
cell.navigationController = navigationController //will assign your viewController's navigation controller to the cell 

return cell 
0

を高く評価され、これはそれを行うには良い方法です。あなたのメシエソリューションの例を与えるために...あなたのセルに

let hostViewController:UIViewController 

プロパティを追加し、それ

let cell = ProductCell(vc: self) 

を処理するための初期化子を追加しかし、私はそれは良くないと思うことができそれを行う方法。あなたの提案はうまくいきます。

let navigationController = application.windows[0].rootViewController as! UINavigationController 
0

UIResponderチェーンがここに役立ちます。あなたが任意のビュー用のコントローラ

extension UIView { 

    func controller() -> UIViewController? { 
     if let nextViewControllerResponder = next as? UIViewController { 
      return nextViewControllerResponder 
     } 
     else if let nextViewResponder = next as? UIView { 
      return nextViewResponder.controller() 
     } 
     else { 
      return nil 
     } 
    } 

    func navigationController() -> UINavigationController? { 
     if let controller = controller() { 
      return controller.navigationController 
     } 
     else { 
      return nil 
     } 
    } 
} 

controller()を見つけるために、レスポンダチェーンを検索することができ

はあなただけのナビゲーションコントローラを見つける必要が返され、コントローラに続いタイプUIViewController のある最も近い応答を返します。ここでnavigationController()を使用できます。

関連する問題