【问题标题】:Cannot Call Value of Non-Function Type 'UICollectionView' in Swift 3无法在 Swift 3 中调用非函数类型“UICollectionView”的值
【发布时间】:2017-03-16 14:51:15
【问题描述】:

预期结果

在自定义标签栏控制器中创建标签栏图标的通用私有方法。应该成功地为每个指示的控制器绘制标签栏图标。

结果

失败了

不能调用非函数类型'UICollectionView'的值

失败(通用)代码:

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


       }

工作(非通用)代码

 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

谢谢。

【问题讨论】:

    标签: ios swift3 uicollectionview


    【解决方案1】:

    在您对createNavController 的定义中,您的参数controllerName 属于UICollectionViewController 类型,这不是函数类型,因此您不能将其作为函数调用,即controllerName(...)

    如果你替换

    let viewController = controllerName(collectionViewLayout: layout)
    

    let viewController = UserController(collectionViewLayout: layout)
    

    根据您的工作代码,它编译得很好。此外,您不再需要 controllerName 参数。反正我不太明白这是干什么用的。您是否希望能够指定控制器type?然后你可以像 dan 建议的那样去做(虽然这段代码需要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()))
    

    这确实不需要UICollectionViewController,因为UINavigationController.init(rootViewController:) 需要UIViewController。这完全取决于您想要实现的目标。

    【讨论】:

      【解决方案2】:

      你想要这样的东西吗?

      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 作为它的根。

      【讨论】:

        【解决方案3】:

        我认为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)
        

        【讨论】:

        • 谢谢,阿尔瓦罗。你怎么称呼这个方法?
        • 虽然 dan 的回答比较笼统,但您不妨试试他的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多