对成员 'collectionView(_:layout:minimumLineSpacingForSectionAt:)' 的模糊引用
Posted
技术标签:
【中文标题】对成员 \'collectionView(_:layout:minimumLineSpacingForSectionAt:)\' 的模糊引用【英文标题】:Ambiguous reference to member 'collectionView(_:layout:minimumLineSpacingForSectionAt:)'对成员 'collectionView(_:layout:minimumLineSpacingForSectionAt:)' 的模糊引用 【发布时间】:2020-01-24 02:24:53 【问题描述】:我在我的代码中发现了一个让我非常恼火的错误。我在一个单独的应用程序中编写了 Swiping View Controller 的代码,现在我正在尝试将它集成到这个新应用程序中。
这是视图控制器类的布局方式:
class SwipingController: UIViewController, UICollectionViewDelegateFlowLayout
基本上报错如下:
Ambiguous reference to member 'collectionView(_:layout:minimumLineSpacingForSectionAt:)'
这是我的一些代码,如果我需要添加更多,请告诉我!!
extension SwipingController
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat
return 0
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return pages.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! PageCell
let page = pages[indexPath.item]
//let page = pages[indexPath.row]
cell.page = page
return cell
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
return CGSize(width: view.frame.width, height: view.frame.height)
在主视图控制器中每次提及“CollectionView”时都会发生错误
@objc private func handleNext()
let nextIndex = min(pageControl.currentPage + 1, pages.count - 1)
let indexPath = IndexPath(item: nextIndex, section: 0)
pageControl.currentPage = nextIndex
collectionView?.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
我现在也收到错误:
Value of type 'SwipingController' has no member 'collectionViewLayout'
在此页面上发生的情况:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
coordinator.animate(alongsideTransition: (_) in
self.collectionViewLayout.invalidateLayout()
if self.pageControl.currentPage == 0
self.collectionView?.contentOffset = .zero
else
let indexPath = IndexPath(item: self.pageControl.currentPage, section: 0)
self.collectionView?.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
) (_) in
如果我需要添加更多代码,请告诉我!
【问题讨论】:
请显示更多上下文。特别是,你声明 SwipingController 符合 UICollectionViewDelegateFlowLayout 了吗? @matt 感谢您抽出宝贵时间发表评论!你能建议我应该显示什么代码吗?我还更新了问题以显示它如何符合 UICollectionViewDelegateFlowLayout 好吧,这很好,但你所说的仍然很神秘,因为你一直在说得很含糊,好像故事中有两个不同的视图控制器。有时有 SwipingController 有时有“主视图控制器”。它们如何相互关联?哪个持有收藏视图?如果 SwipingController 是集合视图控制器,您不能指望“主视图控制器”知道collectionView?.scrollToItem
的含义。
【参考方案1】:
出现问题是因为您尝试在 ViewController
中使用变量 collectionView
时尚未声明,要解决此问题,您需要按如下方式声明它。
Swift 5.x:
@IBOutlet weak var collectionView: UICollectionView?
这会生成一个IBOutlet
,您可以使用它来连接使用情节提要中的UICollectionView
创建的变量。另外别忘了将delegate
和dataSource
与ViewController
连接起来,这将实现它。
func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
更多关于如何实现UICollectionView
的信息请点击here:
作为个人建议,当您声明 UI 变量时,我会说 UIView
、UILabel
或在本例中为 UICollectionView
,使用前缀来保持顺序和合适的命名法。
例如:
@IBOutlet weak var clvPages: UICollectionView?
希望这对您有所帮助,我会继续关注您的 cmets。
【讨论】:
感谢您的回答,我有点困惑。以编程方式创建此页面是否意味着我必须使用情节提要来解决此问题? 如果您有机会进一步解释,我将不胜感激! 感谢您的帮助,您的回答让我深思!【参考方案2】:我设法解决了这个问题,与它搏斗了几个小时:
我的主要问题是情节提要中的视图控制器是视图控制器而不是集合视图控制器。
感谢所有帮助过的人!
【讨论】:
以上是关于对成员 'collectionView(_:layout:minimumLineSpacingForSectionAt:)' 的模糊引用的主要内容,如果未能解决你的问题,请参考以下文章
静态成员 rx 不能在实例类型 UICollectionView 上使用
ValueType "tableViewCell" 没有成员 navigationController
Swift DRY collectionView(_ cellForItemAt) 调用
当您啥都不返回时,从 collectionView(_:viewForSupplementaryElementOfKind:at:) 返回啥?