【发布时间】:2016-09-10 06:30:59
【问题描述】:
在 SO 中可能有类似的问题,但 None 帮助我实现了我的结果,因此最终在这里提问。
情景
我有一个 ViewController(HomeViewController)。在我的 HomeController 中有一个子视图,里面有一个 tableview。此子视图部分可见,用户可以将其平移以显示 Tableview 数据。表格视图将显示消息、照片、注释和事件等通知。我的应用程序是仅限群聊的应用程序。所以这些消息、照片、笔记和事件将基于组显示。一个组将仅显示 25 条消息、8 张照片、2 条笔记和 1 条活动详情。从显示消息开始,我创建了一个 TableviewCell 并将其注册到 HomeViewController 内的 Tableview 中,如下所示
var notifications : NotificationsView!
notifications.frame = CGRectMake(0, -self.view.frame.height + 175, self.view.frame.size.width, self.view.frame.size.height)
notifications._tableview.dataSource = self
notifications._tableview.delegate = self
notifications._tableview.registerNib(UINib(nibName: "TimelineCell", bundle: nil), forCellReuseIdentifier: "timelinecell")
notifications._tableview.registerNib(UINib(nibName: "PhotosCell", bundle: nil), forCellReuseIdentifier: "photos")
notifications._tableview.registerNib(UINib(nibName: "NotesCell", bundle: nil), forCellReuseIdentifier: "notes")
notifications._tableview.registerNib(UINib(nibName: "CalendarCell", bundle: nil), forCellReuseIdentifier: "calendar")
我的模型类看起来像这样
class TimelineModal : Object {
dynamic var groupID = ""
dynamic var groupName = ""
let messages = List<TimelineGroupMessages>()
let photos = List<TimelineGroupPhotos>()
let notes = List<TimelineGroupNotes>()
let calendarDetails = List<TimelineGroupCalendar>()
override class func primaryKey() -> String? { return "groupID" }
}
class TimelineGroupMessages : Object {
dynamic var message = ""
dynamic var userName = ""
dynamic var messagetype = ""
}
class TimelineGroupPhotos : Object {
dynamic var photo = ""
}
class TimelineGroupNotes : Object {
dynamic var noteTitle = ""
}
class TimelineGroupCalendar : Object {
dynamic var calendarEventDate = ""
dynamic var calendarEventTitle = ""
}
Tableview 中的数据将是这样一种方式,即每个组的 Messages(25) 首先显示,然后是 Photos(8),然后是 Notes (2),最后是 Event (1),同样的格式数据将再次显示给另一组。
为了显示数据,来自领域的数据在 viewWillAppear() 上获取
private var numberofRowsforTimeline : Int = 0
private var realmdata : Results<TimelineModal>!
private var groupsCount : Int = 0
private var messagesCount : Int = 0
private var photosCount : Int = 0
private var notesCount : Int = 0
private var eventsCount : Int = 0
private func LoadDatafromRealm()
{
let realm = try! Realm()
let realmDbData = realm.objects(TimelineModal)
print("Data : \(realmDbData)")
groupsCount = realmDbData.count
let messages_Count : Int = Int(realm.objects(TimelineGroupMessages).count)
let photos_Count : Int = Int(realm.objects(TimelineGroupPhotos).count)
let notes_Count : Int = Int(realm.objects(TimelineGroupNotes).count)
let events_Count : Int = Int(realm.objects(TimelineGroupCalendar).count)
self.realmdata = realmDbData
numberofRowsforTimeline += messages_Count + photos_Count + notes_Count + events_Count
}
这是我得到提到的错误的代码
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberofRowsforTimeline
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell : UITableViewCell!
// let cellMessages : TimelineCell = tableView.dequeueReusableCellWithIdentifier("timelinecell", forIndexPath: indexPath) as! TimelineCell
//let cellPhotos : PhotosCell = tableView.dequeueReusableCellWithIdentifier("photos", forIndexPath: indexPath) as! PhotosCell
//let cellNotes : NotesCell = tableView.dequeueReusableCellWithIdentifier("notes", forIndexPath: indexPath) as! NotesCell
//let cellCalendar : CalendarCell = tableView.dequeueReusableCellWithIdentifier("calendar", forIndexPath: indexPath) as! CalendarCell
for __data in self.realmdata
{
if __data.messages.count > 0
{
let cellMessages : TimelineCell = tableView.dequeueReusableCellWithIdentifier("timelinecell", forIndexPath: indexPath) as! TimelineCell
for x in 0..<__data.messages.count - 1
{
cellMessages.topConstraintforgroupNameLabel.constant = heightConstraints.topConstraintForRowZero.rawValue
cellMessages.topConstraintfortabNameLabel.constant = heightConstraints.topConstraintForRowZero.rawValue
cellMessages.lblGroupID.text = __data.groupID
cellMessages.lblGroupID.hidden = true
cellMessages.lblGroupName.text = __data.groupName
cellMessages.lblmessage.text = __data.messages[x].message
return cellMessages
}
}
else if __data.photos.count > 0
{
let cellPhotos : PhotosCell = tableView.dequeueReusableCellWithIdentifier("photos", forIndexPath: indexPath) as! PhotosCell
for p in 0..<__data.photos.count - 1
{
cellPhotos.imgPhoto1_photos.image = UIImage(imageLiteral: __data.photos[p].photo)
return cellPhotos
}
}
else if __data.notes.count > 0
{
let cellNotes : NotesCell = tableView.dequeueReusableCellWithIdentifier("notes", forIndexPath: indexPath) as! NotesCell
for n in 0..<__data.notes.count - 1
{
cellNotes.lblNoteName1.text = __data.notes[n].noteTitle
return cellNotes
}
}
else if __data.calendarDetails.count > 0
{
let cellCalendar : CalendarCell = tableView.dequeueReusableCellWithIdentifier("calendar", forIndexPath: indexPath) as! CalendarCell
for c in 0..<__data.calendarDetails.count - 1
{
cellCalendar.lblEventName1.text = __data.calendarDetails[c].calendarEventTitle
return cellCalendar
}
}
else
{
return cell
}
}
} //-> Error Mssing return in a function expected to return 'UITableViewCell'
我哪里出错了?对不起,如果我的问题太宽泛了。只是想确保你明白我需要什么。就是这样。帮助!帮助!救命!
注意:我尝试以不同的方式返回 Cell,其中提到的错误没有发生,但 Tableview 对所有单元格都有相同的数据。
【问题讨论】:
-
我想你误解了 tableView 委托和数据源方法是如何用于构建 tableView 的。特别是,
cellForRowAtIndexPath被多次调用,对于要显示的每一行调用一次。 indexPath 参数告诉您需要哪个部分/行。无需遍历您的数据 - 只需使用 indexPath 来选择数组中的正确元素。循环在任何情况下都是徒劳的,因为第一次执行return语句时,整个函数都会终止 - 循环不会进入下一次迭代。 -
@pbasdf 我部分理解你...你能用我的例子显示相同的代码吗?我相信这样会更好......
-
@pbasdf 如何使用 indexPath 从多维数组中获取正确的元素?我现在有点迷茫……
标签: ios swift uitableview realm