UITableView

时间:2016-06-30 23:12:23

标签: ios swift uitableview

我正在尝试创建一个联系人页面,您可以在收到朋友请求时看到所有联系人与朋友请求单元格显示,但如果您没有,则不会显示。目前,两个自定义单元格都能正常工作。我遇到的问题是contactRequestTableViewCell重叠了contactListTableViewCell的第一个单元格。

我已经研究过有关两个自定义tableviewcells的其他问题,但没有一个问题与我面临的问题相同。

enter image description here

This is what my storyboard looks like

这是我目前执行的代码,我在表格视图中返回2个部分。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ContactListTableViewCell
    let requestCell = tableView.dequeueReusableCellWithIdentifier("requestCell", forIndexPath: indexPath) as! ContactRequestsTableViewCell


    let user = OneRoster.userFromRosterAtIndexPath(indexPath: indexPath)


    if (amountOfBuddyRequests > 0) {


        if (indexPath.section == 0) {

            requestCell.hidden = false
            cell.hidden = false
            requestCell.friendRequestLabel.text = "test"


        } else if (indexPath.section >= 1) {

    cell.contactNameLabel!.text = user.displayName;
    cell.contactHandleLabel!.text = "@ " + beautifyJID(user.jidStr)
    cell.contactHandleLabel!.textColor = UIColor.grayColor()

    OneChat.sharedInstance.configurePhotoForImageView(cell.imageView!, user: user)
        }

        return cell;
    }

    else { // if buddy requests == 0
        requestCell.hidden = true



        cell.contactNameLabel!.text = user.displayName;
        cell.contactHandleLabel!.text = "@ " + beautifyJID(user.jidStr)
        cell.contactHandleLabel!.textColor = UIColor.grayColor()            

        print ("This is how many unreadMessages it has \(user.unreadMessages)")

        // If there is unread messages for a person highlight it blue
        // However this feature isn't working right now due to unreadMessages bug
        if user.unreadMessages.intValue > 0 {
            cell.backgroundColor = .blueColor()
        } else {
            cell.backgroundColor = .whiteColor()
        }

                OneChat.sharedInstance.configurePhotoForCell(cell, user: user)

        return cell;
    }


}

enter image description here

这是我现在拥有的当前输出,我的单元格有"测试"正在掩盖其他contactListTableViewCells。

2 个答案:

答案 0 :(得分:0)

函数tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell应始终在indexPath返回一个且唯一一个 TableViewCell,因此您不希望始终返回cell输入ContactListTableViewCell

根据documentationcellForRowAtIndexPath tableView方法要求indexPath处的单元格,这意味着字面上某个区域的某一行只能有一个单元格,因此返回两个单元格不是一个选项。

我建议您使用两个数组来存储请求和联系人信息。例如,您有数组requestscontacts。然后你可以告诉tableView你想要多少行:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of rows in the section.
    return requests.count + contacts.count
}

然后在cellForRowAtIndexpath中执行以下操作:

override func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row < requests.count {
        // return a request cell
    }
    else {
        // return a contact cell
    }
}

我这里只使用一个tableView部分。如果您仍然想要两个部分,则只需在numberOfSections函数中返回2,并在cellForRowAtIndexPath中为indexPath.section添加if语句。

希望这有帮助。

答案 1 :(得分:0)

事实证明,问题在于处理数据源。我的数据源没有指向正确的tableviewcell。这导致他们指向不正确的单元格。通过重新构建现有的数据源系统来解决此问题。此问题不会影响大多数,因为默认情况下数据源将指向正确的tableviewcell。

与另一张海报所说的相反,您实际上可以在一张表中显示两个或更多自定义单元格。这就是我修复tableView显示问题的方法:

var friendRequests = ["FriendRequest1", "FriendRequest2"]
var contacts = ["User1","User2","User3","User4"]
var amountOfBuddyRequests = 1


 override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    if (amountOfBuddyRequests > 0) {
        return 2
    }

    return 1
}




override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if (amountOfBuddyRequests > 0) {
        if (section == 0) {
            return friendRequests.count
        }

    }
  return contacts.count




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {



    if (amountOfBuddyRequests > 0) {
        if (indexPath.section == 0) {
            let requestCell = tableView.dequeueReusableCellWithIdentifier("requestCell") as! ContactRequestsTableViewCell

            requestCell.friendRequestLabel.text = friendRequests[indexPath.row]
            requestCell.onButtonTapped = {
                self.friendRequests.removeAtIndex(indexPath.row)
                self.tableView.reloadData()
            }
            requestCell.addButtonTapped = {
                self.addUser(self.friendRequests[indexPath.row])
                self.friendRequests.removeAtIndex(indexPath.row)
                self.tableView.reloadData()
            }


            return requestCell
        }
    }


    let friendCell = tableView.dequeueReusableCellWithIdentifier("FriendCell") as! ContactListTableViewCell
    friendCell.contactNameLabel.text = contacts[indexPath.row]




    return friendCell
}