2017-03-16 44 views
0

調用的非功能型「UICollectionView」價值預期結果不能在斯威夫特3

在定製的TabBar控制器創建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迅速3的xcode 8

謝謝。

回答

1

在你createNavController的參數controllerName的定義是UICollectionViewController型的,這是不是一個函數類型,所以你不能把它作爲一個功能,即controllerName(...)

如果您從工作的代碼替換

let viewController = controllerName(collectionViewLayout: layout) 

let viewController = UserController(collectionViewLayout: layout) 

,它編譯罰款。另外,您不再需要controllerName參數。無論如何,我不太明白這是什麼。您是否想要指定控制器類型?那麼你可以像丹建議那樣做(儘管這個代碼需要UICollectionViewController,因爲你會使用init(collectionViewLayout:))。

你也可以通過你想鑲嵌在導航控制器這樣的視圖控制器的實例:

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

,並調用它像這樣:

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

這的確不需要因爲UINavigationController.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

謝謝,阿爾瓦羅。你怎麼稱呼這個方法? –

+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作爲其根。