UICollectionView使用reloadData()方法之后,Cell 里面的控件报错找不到

头发还没秃a 2016-02-29 09:05:57

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
NSLog("\(indexPath.row)")
let collectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("collectionCellLocation", forIndexPath: indexPath) as UICollectionViewCell

let cityLocationButton = collectionCell.viewWithTag(1) as! UIButton
let autoLocationButton = collectionCell.viewWithTag(2) as! UIButton
if indexPath.row > 0 {
NSLog("1111111")
autoLocationButton.hidden = true
cityLocationButton.setTitle(searchCityList[indexPath.row-1], forState: UIControlState.Normal)
}else{
cityLocationButton.hidden = true
}

//添加手动定位点击事件
cityLocationButton.tag = indexPath.row
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "clickForCityName:")
cityLocationButton.addGestureRecognizer(tapGestureRecognizer)
//添加自动定位点击事件
autoLocationButton.tag = indexPath.row
autoLocationButton.addTarget(self, action: "clickAutoLocation:", forControlEvents: UIControlEvents.TouchUpInside)

return collectionCell
}


刚进来的时候可以正常显示控件,但是reloadData()之后,就报错:

let cityLocationButton = collectionCell.viewWithTag(1) as! UIButton

这一行显示错误信息是:fatal error: unexpectedly found nil while unwrapping an Optional value
望大神们解答
...全文
309 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
头发还没秃a 2016-03-01
  • 打赏
  • 举报
回复
引用 4 楼 disburden 的回复:
委托,协议,代理是一种设计模式,你实现的func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell这个方法就是一个协议方法 这个是ios中最重要的一种设计模式,没有之一,如果没有弄明白委托和代理,基本上ios开发就入不了门,这个说起来比较麻烦,一两句话说不清楚,你去网络上搜一下,铺天盖地.
OK,谢谢解答
不担心 2016-02-29
  • 打赏
  • 举报
回复
你这种设计方式不对 在你这种方式里button的tag变成有两个作用,1.根据tag找到button视图 2.根据tag标识当前记录在数据源中的位置 所以你这里的tag是冲突的. 你应该将按钮的点击事件放在你自定的cell里,然后把点击cell要做的事情通过协议让数据源所在的类来实现.
头发还没秃a 2016-02-29
  • 打赏
  • 举报
回复
找到原因了,是因为添加了 Button 的点击事件造成的,这是为什么呢?有什么办法解决么?
不担心 2016-02-29
  • 打赏
  • 举报
回复
委托,协议,代理是一种设计模式,你实现的func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell这个方法就是一个协议方法 这个是ios中最重要的一种设计模式,没有之一,如果没有弄明白委托和代理,基本上ios开发就入不了门,这个说起来比较麻烦,一两句话说不清楚,你去网络上搜一下,铺天盖地.
头发还没秃a 2016-02-29
  • 打赏
  • 举报
回复
引用 2 楼 disburden 的回复:
你这种设计方式不对 在你这种方式里button的tag变成有两个作用,1.根据tag找到button视图 2.根据tag标识当前记录在数据源中的位置 所以你这里的tag是冲突的. 你应该将按钮的点击事件放在你自定的cell里,然后把点击cell要做的事情通过协议让数据源所在的类来实现.
引用 2 楼 disburden 的回复:
你这种设计方式不对 在你这种方式里button的tag变成有两个作用,1.根据tag找到button视图 2.根据tag标识当前记录在数据源中的位置 所以你这里的tag是冲突的. 你应该将按钮的点击事件放在你自定的cell里,然后把点击cell要做的事情通过协议让数据源所在的类来实现.
你的意思是两个 Button 使用 outlet么?抱歉,我是新手,“然后把点击cell要做的事情通过协议让数据源所在的类来实现” 这句话不太理解

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧