简体   繁体   English

在Swift 3中无法调用非函数类型'UICollectionView'的值

[英]Cannot Call Value of Non-Function Type 'UICollectionView' in Swift 3

Intended Outcome 预期结果

A generic private method for creating tabbbar icons in a custom tabbar controller. 在自定义标签栏控制器中创建标签栏图标的通用私有方法。 Should successfully paint the tabbar icons for each indicated controller. 应该为每个指示的控制器成功绘制标签栏图标。

Result 结果

Fails with 与失败

Cannot Call Value of Non-Function Type 'UICollectionView' 无法调用非功能类型'UICollectionView'的值

Failing (Generic) Code: 失败(通用)代码:

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


       }

Working (non-generic) Code 工作(非通用)代码

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

Related 有关

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

        collectionView?.backgroundColor = UIColor.green

    }
}

Environment 环境

ios 10 swift 3 xcode 8 iOS 10 Swift 3 Xcode 8

Thanks. 谢谢。

In your definition of createNavController your parameter controllerName is of type UICollectionViewController and that is not a function type so you cannot call it as a function, ie controllerName(...) . 在您的createNavController定义中,参数controllerName的类型为UICollectionViewController ,并且不是函数类型,因此无法将其作为函数调用,即controllerName(...)

If you replace 如果您更换

let viewController = controllerName(collectionViewLayout: layout)

with

let viewController = UserController(collectionViewLayout: layout)

from your working code, it compiles fine. 从您的工作代码,它可以正常编译。 Also, you don't need the controllerName parameter anymore. 另外,您不再需要controllerName参数。 I don't quite understand what this is for anyway. 我还是不太明白这是什么意思。 Did you want to be able to specify the controller type ? 您是否希望能够指定控制器类型 Then you could do it like dan suggests (although this code requires a UICollectionViewController because you would be using init(collectionViewLayout:) ). 然后,您可以像dan建议一样执行此操作(尽管此代码需要UICollectionViewController因为您将使用init(collectionViewLayout:) )。

You could also pass an instance of the view controller you want embedded in the navigation controller like this: 您也可以像这样传递要嵌入到导航控制器中的视图控制器的实例:

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

and call it like this: 并这样称呼它:

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

This would indeed not require a UICollectionViewController because UINavigationController.init(rootViewController:) takes a UIViewController . 实际上,这将不需要UICollectionViewController因为UINavigationController.init(rootViewController:)需要一个UIViewController It all depends on what you want to achieve. 这完全取决于您要实现的目标。

Do you want something like this? 你想要这样的东西吗?

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
}

Then you can do: let nav = createNavController(imageName: "loc-map-route", UserCollectionController.self) and nav will have a UserCollectionController as its root. 然后,您可以执行以下操作: let nav = createNavController(imageName: "loc-map-route", UserCollectionController.self)并且nav将以UserCollectionController作为其根。

I think that controllerName is an instance of UICollectionViewController, so it is an already initialized UICollectionViewController. 我认为controllerName是UICollectionViewController的实例,因此它是一个已初始化的UICollectionViewController。 It is not the name of the UICollectionViewController subclass. 它不是UICollectionViewController子类的名称。 So if you just want to set the collectionViewLayout of that UICollectionViewController, I'd do: 因此,如果您只想设置该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
}

The you would call it like this: 您会这​​样称呼它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 快速错误:无法调用非函数类型“ SKSpriteNode”的值 - Swift error: Cannot call value of non-function type “SKSpriteNode” ResponseSerializer&#39;无法使用Swift 3调用非函数类型&#39;NSHTTPURLResponse?&#39;的值 - ResponseSerializer 'cannot call value of non-function type 'NSHTTPURLResponse?'' with Swift 3 无法调用非函数类型的值 &#39;((AnyObject) -&gt; AnyObject?)!&#39; - 斯威夫特 3 - Cannot call value of non-function type '((AnyObject) -> AnyObject?)!' - Swift 3 错误:Swift 3上的“无法调用非函数类型的值” - Error: 'Cannot call value of non-function type' on Swift 3 无法调用非功能类型的值 - Cannot call value of non-function type 无法调用非功能类型的值 - Cannot call value of non-function type collectionView(collectionView,didSelectItemAt:indexPath)-无法调用非函数类型&#39;UICollectionView的值 - collectionView(collectionView, didSelectItemAt: indexPath) - Cannot call value of non-function type 'UICollectionView Swift:类型的值没有成员,无法调用非函数类型的值 - Swift: value of type has no member, cannot call value of non-function type 无法在 Swift 中的 function 错误中调用非函数类型 'SwipeCard' 的值 - Cannot call value of non-function type 'SwipeCard' in the function error in Swift 无法调用非函数类型&#39;JSON&#39;的值,如何从Swift中的块返回值 - Cannot call value of non-function type 'JSON', How can I return value from block in Swift
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM