我试图根据段控件的索引更改collectionView的数据。当我运行我的代码时,我会崩溃。有人能告诉我我在这里做错了什么吗?我在遵循我发现的不同方法。我从崩溃中得到的错误代码是
线程1: EXC_BREAKPOINT (code=1,subcode=0x1da72fde0)
当我尝试在段索引之间切换时,会发生错误。发生在电话线上
cell.trendsLabel.text = maleTrends[indexPath.row]的
func handleSegControlTapped(for header: HomeViewHeaderReusableView) var header: HomeViewHeaderReusableView?
func handleSegControlTapped(for header: HomeViewHeaderReusableView) {
collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)
switch header.segmentedControl?.selectedSegmentIndex {
case 0:
print("Display female trends")
header.segmentedControl?.selectedSegmentIndex = 0
let indexPath = IndexPath()
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell
cell.trendsLabel.text = femaleTrends[indexPath.row]
cell.trendsImageView.image = femaleImages[indexPath.row]
case 1:
print("Display male trends")
header.segmentedControl?.selectedSegmentIndex = 1
let indexPath = IndexPath()
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell
cell.trendsLabel.text = maleTrends[indexPath.row]
cell.trendsImageView.image = maleImages[indexPath.row]
default:
break
}
collectionView.reloadData()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
let segmentedOutlet = header?.segmentedControl
switch segmentedOutlet?.selectedSegmentIndex {
case 0: return femaleTrends.count
case 1: return maleTrends.count
default: print("opps, cant load data")
}
return 0
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "homeViewCell", for: indexPath) as! CurrentTrendsCell
let segmentedOutlet = header?.segmentedControl
switch segmentedOutlet?.selectedSegmentIndex {
case 0: cell.trendsLabel.text = femaleTrends[indexPath.row]
cell.trendsImageView.image = femaleImages[indexPath.row]
case 1: cell.trendsLabel.text = maleTrends[indexPath.row]
cell.trendsImageView.image = maleImages[indexPath.row]
default: break
}
return cell
} func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "homeViewReuseCell", for: indexPath) as! HomeViewHeaderReusableView
headerView.delegate = self
return headerView
}编辑
以下是标题中的代码
class HomeViewHeaderReusableView: UICollectionReusableView {
@IBOutlet weak var segmentedControl: UISegmentedControl?
var delegate: HomeSegmentedControl?
// MARK: Handler
@objc func handleSegTapped() {
delegate?.handleSegControlTapped(for: self)
}
@IBAction func segmentedTapped(_ sender: Any) {
handleSegTapped()
// change data based on female / male
}
override func awakeFromNib() {
super.awakeFromNib()
segmentedControl?.tintColor = .clear
segmentedControl?.layer.borderColor = UIColor.clear.cgColor
segmentedControl?.setBackgroundImage(UIImage(), for: .normal, barMetrics: .default)
segmentedControl?.setTitleTextAttributes([
NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 11),
NSAttributedString.Key.foregroundColor: UIColor.lightGray
], for: .normal)
segmentedControl?.setTitleTextAttributes([
NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 11) ,
NSAttributedString.Key.foregroundColor: UIColor.white
], for: .selected)
segmentedControl?.selectedSegmentIndex = 0
}发布于 2019-11-25 09:59:41
从来没有,从来没有给dequeueReusableCell打过cellForRow/ cellForItem以外的电话。单元将被排除队列,但当方法退出时将被取消分配。与集合/表视图数据源方法不同,单元格不返回任何地方。
编辑:
替换
var header: HomeViewHeaderReusableView?使用
var selectedSegmentIndex = 0然后将整个方法handleSegControlTapped替换为
func handleSegControlTapped(for header: HomeViewHeaderReusableView) {
selectedSegmentIndex = header.segmentedControl!.selectedSegmentIndex
collectionView.reloadData()
}由于数据源方法处理分段控件的状态,因此只需重新加载集合视图就足够了。
然后将numberOfItemsInSection更改为
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
switch selectedSegmentIndex {
case 0: return femaleTrends.count
case 1: return maleTrends.count
default: print("opps, cant load data")
return 0
}
}并相应地更改其他数据源方法。
发布于 2019-11-25 09:06:23
根据您对段的选择,只需重新加载collectionView并在cellForItemAt中配置CollectionViewCell。
不管您在哪里添加了段控件,只需对操作方法做出真正的反应,并相应地更新集合。
https://stackoverflow.com/questions/59026734
复制相似问题