一个 Viewcontroller 中的多个 collectionview 导致 Index out of range 错误
Posted
技术标签:
【中文标题】一个 Viewcontroller 中的多个 collectionview 导致 Index out of range 错误【英文标题】:Multiple collectionviews in one Viewcontroller causes Index out of range error 【发布时间】:2018-12-21 21:46:53 【问题描述】:我尝试在一个视图控制器中使用三个集合视图。我像以下方法所示解析数据: 在底部,我根据位置将数据添加到右侧列表(这部分有效)
func getEventData(eventIDs: [String], plz: String, positiona: Int)
for eventId in eventIDs
let ref = Database.database().reference().child("Events").child(plz).child(eventId)
ref.observe(.value, with: snapshot in
let item = snapshot.value as? [String: AnyObject]
let eventName = item?["name"] as! String
let date = item?["date"] as! String
let lat = item?["lat"] as! String
let lng = item?["lng"] as! String
let infos = item?["additionalInfos"] as! String
let position = item?["position"] as! String
let ts = item?["ts"] as! Int
let createdBy = item?["createdBy"] as! String
let timestamp = NSDate().timeIntervalSince1970
if (ts > Int(timestamp))
let eo = EventObject(eventID: eventId, eventName:
eventName, info: infos, createdBy: createdBy, date: date, lat: lat, lng: lng, position: position, ts: ts)
if positiona == 0
self.acceptedEvents.append(eo)
self.acceptedEventscv.reloadData()
else if positiona == 1
self.myEvents.append(eo)
self.myEventscv.reloadData()
else if positiona == 2
self.storedEvents.append(eo)
self.storedEventscv.reloadData()
)
在我的 NumbersofItemsInSection 方法中,我执行了以下操作:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
if collectionView == self.acceptedEventscv
return acceptedEvents.count
else if collectionView == self.storedEventscv
return storedEvents.count
else if collectionView == self.myEventscv
return myEvents.count
else
return 0
在我的 CellForRowAtItem 方法中,我尝试了以下方法
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if collectionView == self.acceptedEventscv
let cell =
collectionView.dequeueReusableCell(withReuseIdentifier:
"acceptedEventsCell", for: indexPath) as!
acceptedEventsCollectionViewCell
let eo = acceptedEvents[indexPath.row]
cell.eventName.text = eo.eventName
let items = eo.date!.components(separatedBy: " ")//Here replase
space with your value and result is Array.
//Direct line of code
//let items = "This is my String".components(separatedBy: " ")
let date = items[0]
let time = items[1]
cell.date.text = date
cell.time.text = time
getUserNameAge(label: cell.usernameAge)
return cell
else
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "savedEventsCell", for: indexPath) as! savedEventsCollectionViewCell
let eo = acceptedEvents[indexPath.row]
cell.eventName.text = eo.eventName
let items = eo.date!.components(separatedBy: " ")//Here replase space with your value and result is Array.
//Direct line of code
//let items = "This is my String".components(separatedBy: " ")
let date = items[0]
let time = items[1]
cell.date.text = date
cell.time.text = time
getUserNameAge(label: cell.usernameAge)
return cell
问题是,如果我在第二个 CollectionView 中有更多项目,我总是会收到此错误:
线程 1:致命错误:索引超出范围
在这行代码:
let eo = acceptedEvents[indexPath.row]
【问题讨论】:
【参考方案1】:cellForItemAt
也一定是这样的
if collectionView == self.acceptedEventscv
let item = acceptedEvents[indexPath.row]
----
return cell
else if collectionView == self.storedEventscv
let item = storedEvents[indexPath.row]
----
return cell
else
let item = myEvents[indexPath.row]
----
return cell
在您的情况下,现在发生的情况是,在 numberOfItemsInSection
中返回的计数可能不同的两种情况下,您都访问了相同的数组 acceptedEvents
【讨论】:
以上是关于一个 Viewcontroller 中的多个 collectionview 导致 Index out of range 错误的主要内容,如果未能解决你的问题,请参考以下文章