2017-03-16 8 views
0

にアウトカムは非関数型の値を呼び出すことはできません「UICollectionView」スウィフト3

カスタムタブバーコントローラにtabbbarアイコンを作成するための一般的な民間の方法対象としています。示された各コントローラのタブバーアイコンを正常に描画する必要があります。

private func createNavController(imageName: String, _ controllerName: UICollectionViewController) -> UINavigationController { 

       let layout = UICollectionViewFlowLayout() 
Thrown Here-> let viewController = controllerName(collectionViewLayout: layout) 
       let navController = UINavigationController(rootViewController: viewController) 
       navController.tabBarItem.image = UIImage(named: imageName) 

       return navController 


     } 

結果

非機能型の値を呼び出すことはできません 'UICollectionView'

失敗(ジェネリック)コードで失敗します

作業(非ジェネリック)コード

let userLayout = UICollectionViewFlowLayout() 
let userController = UserController(collectionViewLayout: userLayout) 
let navController = UINavigationController(rootViewController: userController) 
navController.tabBarItem.image = UIImage(named: "loc-map-route") 

関連

class UserController : UICollectionViewController, UICollectionViewDelegateFlowLayout 
{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     collectionView?.backgroundColor = UIColor.green 

    } 
} 

環境

IOS 10 SWIFT 3のXcode 8

ありがとうございます。 createNavControllerあなたのパラメータcontrollerNameのあなたの定義では

答えて

1

はタイプUICollectionViewControllerのものであり、あなたはすなわちcontrollerName(...)、機能としてそれを呼び出すことはできませんので、それは関数型ではありません。

、あなたの作業コードから

let viewController = UserController(collectionViewLayout: layout) 

let viewController = controllerName(collectionViewLayout: layout) 

を交換した場合、それが正常にコンパイルされます。また、controllerNameパラメータは必要ありません。とにかくこれがどういうものなのか分かりません。コントローラを指定できるようにしたいですか?それでダンが示唆するようにすることができます(init(collectionViewLayout:)を使用するため、このコードにはUICollectionViewControllerが必要です)。

また、あなたは、このようなナビゲーションコントローラに埋め込まれたいビューコントローラのインスタンスを渡すことができます。これは確かに必要としない

let navController = createNavController(
    imageName: "loc-map-route", 
    rootViewController: UserController(collectionViewLayout: UICollectionViewFlowLayout())) 

private func createNavController(imageName: String, rootViewController: UIViewController) -> UINavigationController 
{ 
      let navController = UINavigationController(rootViewController: rootViewController) 
      navController.tabBarItem.image = UIImage(named: imageName) 
      return navController 
} 

をし、このようにそれを呼び出しますUICollectionViewControllerUINavigationController.init(rootViewController:)UIViewControllerであるためです。それはすべてあなたが達成したいことにかかっています。

0

私はcontrollerNameがUICollectionViewControllerのインスタンスだと思うので、すでに初期化されているUICollectionViewControllerです。これは、UICollectionViewControllerサブクラスの名前ではありません。だからだけではUICollectionViewControllerのcollectionViewLayoutを設定したい場合は、私がしたい:

private func createNavController(imageName: String, _ controllerName: UICollectionViewController) -> UINavigationController 
{ 
    let layout = UICollectionViewFlowLayout() 
    let viewController = controllerName.collectionViewLayout = layout 
    let navController = UINavigationController(rootViewController: viewController) 
    navController.tabBarItem.image = UIImage(named: imageName) 

    return navController 
} 

ザ・あなたはこのようにそれを呼び出します。

let navController = createNavController(imageName: "my_image", myCreatedUserController) 
+0

ありがとう、Alvaro。あなたはどうやってこのメソッドを呼び出しますか? –

+0

問題ありません!私は自分の答えを更新しました –

+0

ダンの答えはより一般的ですが、あなたは彼の答えを試してみるとよいでしょう。 –

1

あなたはこのような何かをしたいですか?

private func createNavController<T: UICollectionViewController>(imageName: String, _ controllerName: T.Type) -> UINavigationController { 
    let layout = UICollectionViewFlowLayout() 
    let viewController = controllerName.init(collectionViewLayout: layout) 
    let navController = UINavigationController(rootViewController: viewController) 
    navController.tabBarItem.image = UIImage(named: imageName) 
    return navController 
} 

次に、あなたが行うことができます:let nav = createNavController(imageName: "loc-map-route", UserCollectionController.self)とNAVをそのルートとしてUserCollectionControllerを持つことになります。

関連する問題