无法在 Swift 3 中调用非函数类型“UICollectionView”的值
Posted
技术标签:
【中文标题】无法在 Swift 3 中调用非函数类型“UICollectionView”的值【英文标题】:Cannot Call Value of Non-Function Type 'UICollectionView' in Swift 3 【发布时间】: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
谢谢。
【问题讨论】:
【参考方案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 的回答比较笼统,但您不妨试试他的回答。以上是关于无法在 Swift 3 中调用非函数类型“UICollectionView”的值的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 错误“无法调用非函数类型 'UITableView!' 的值” [关闭]
无法调用非函数类型“任何?!”的值:- Firebase,Swift3
无法调用非函数类型“((AnyObject)-> AnyObject?)!”的值- 斯威夫特 3
Swift 错误:无法调用非函数类型“SKSpriteNode”的值