我正在尝试创建一个联系人页面,您可以在收到朋友请求时看到所有联系人与朋友请求单元格显示,但如果您没有,则不会显示。目前,两个自定义单元格都能正常工作。我遇到的问题是contactRequestTableViewCell重叠了contactListTableViewCell的第一个单元格。
我已经研究过有关两个自定义tableviewcells的其他问题,但没有一个问题与我面临的问题相同。
这是我目前执行的代码,我在表格视图中返回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;
}
}
这是我现在拥有的当前输出,我的单元格有"测试"正在掩盖其他contactListTableViewCells。
答案 0 :(得分:0)
函数tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
应始终在indexPath
返回一个且唯一一个 TableViewCell,因此您不希望始终返回cell
输入ContactListTableViewCell
。
根据documentation,cellForRowAtIndexPath
tableView方法要求indexPath处的单元格,这意味着字面上某个区域的某一行只能有一个单元格,因此返回两个单元格不是一个选项。
我建议您使用两个数组来存储请求和联系人信息。例如,您有数组requests
和contacts
。然后你可以告诉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
}