【问题标题】:Mssing return in a function expected to return 'UITableViewCell'预期返回“UITableViewCell”的函数中缺少返回
【发布时间】: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


【解决方案1】:

我认为您误解了如何使用 tableView 委托和数据源方法来构建 tableView。特别是,cellForRowAtIndexPath 方法被多次调用,对于要显示的每一行调用一次。 indexPath 参数告诉您需要哪个部分/行。无需遍历您的数据 - 只需使用 indexPath 选择数组中的正确元素。循环在任何情况下都是徒劳的,因为第一次执行 return 语句时,整个函数都会终止 - 循环不会进入下一次迭代。

例如,以下应生成一个表格,其中每个组都有一个部分,每个部分中的行用于消息、照片、笔记和事件:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.groupsCount // separate section for each Group
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // locate the correct Group for the given section
    let __data = self.realmdata[section]
    // the total number of rows for this section (ie Group) is:
    // number of messages + number of photos + number of notes + number of events:
    return __data.messages.count + __data.photos.count + __data.notes.count + __data.calendarDetails.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // locate the correct Group for the given section (using the indexPath)
    let __data = self.realmdata[indexPath.section]
    if (indexPath.row < __data.messages.count) { // first rows are the messages
        // use the indexPath.row to get the required index for the messages:
        let messageIndex = indexPath.row
        let cellMessages : TimelineCell = tableView.dequeueReusableCellWithIdentifier("timelinecell", forIndexPath: indexPath) as! TimelineCell
        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
        // use the index to locate the correct message text:
        cellMessages.lblmessage.text = __data.messages[messageIndex].message
        return cellMessages
    } else if (indexPath.row < __data.messages.count + __data.photos.count) { // next are the photos
        // use the indexPath.row (adjusted to account for the messages rows) to get the required index for the photos:
        let photoIndex = indexPath.row - __data.messages.count
        let cellPhotos : PhotosCell    = tableView.dequeueReusableCellWithIdentifier("photos", forIndexPath: indexPath)  as! PhotosCell
        cellPhotos.imgPhoto1_photos.image = UIImage(imageLiteral: __data.photos[photoIndex].photo)
        return cellPhotos
    } else if (indexPath.row < __data.messages.count + __data.photos.count + __data.notes.count) { // next are the notes
        let noteIndex = indexPath.row - __data.messages.count - __data.photos.count
        let cellNotes : NotesCell     = tableView.dequeueReusableCellWithIdentifier("notes", forIndexPath: indexPath) as! NotesCell
        cellNotes.lblNoteName1.text = __data.notes[noteIndex].noteTitle
        return cellNotes
    } else { // next are the Events
        let eventIndex = indexPath.row - __data.messages.count - __data.photos.count - __data.notes.count
        let cellCalendar    : CalendarCell  = tableView.dequeueReusableCellWithIdentifier("calendar", forIndexPath: indexPath)       as! CalendarCell
        cellCalendar.lblEventName1.text = __data.calendarDetails[eventIndex].calendarEventTitle
        return cellCalendar
    }
}

【讨论】:

  • 我欠你的... :)
  • 一切正常,但我有一个问题要问。如果事件中没有任何数据,查看最后一个 else 情况是否有效?
  • @Joker 如果 events 中没有数据,那么总行数将是 25+8+2+0 = 35。由于这是numberOfRowsInSection返回的值,所以表格视图将通过使用相应的 indexPath 行值调用 cellForRowAtIndexPath 来填充第 0-34 行。但它甚至不会尝试填充第 35 行(“事件”行)。所以最后一个else子句不会被执行。
猜你喜欢
  • 2019-05-14
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多