我无法围绕cellForRowAtIndexPath
中的部分实现。
我有UITableView
,其中我想展示2个部分。
在Storyboard中,我将UITableView
Style
更改为Grouped
。
接下来,如果没有朋友请求,我希望没有Friend Request
部分。在viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
(...)
if friendRequests.isEmpty {
friendsDataSource = friends
} else {
friendsDataSource = [friendRequests, friends]
}
}
其余的:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return friendsDataSource.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return friendsDataSource[section].count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let friendRequest = friendsDataSource[0][indexPath.row]
let friend = friendsDataSource[1][indexPath.row]
if let cell = tableView.dequeueReusableCellWithIdentifier("FriendCell") as? FriendCell {
cell.configureProfileCell(userProfile)
return cell
} else {
return FriendCell()
}
}
我知道我的cellForRowAtIndexPath
很恶心,但我完全不知道如何实施它。
任何正确方向的帮助,非常感谢
答案 0 :(得分:2)
发现了if (indexPath.section == 0)
,我刚刚破解了它。
我的眼睛看着这样疼,所以请发布更好的方法。现在:
var friendRequests = [FriendRequest]()
var friends = [UserProfile]()
var friendsDataSource = []
override func viewDidLoad() {
super.viewDidLoad()
friends = FriendManager.instance.myFriends
friendRequests = FriendManager.instance.incomingFriendRequests
if friendRequests.isEmpty {
friendsDataSource = [friends]
} else {
friendsDataSource = [friendRequests, friends]
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return friendsDataSource.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return friendsDataSource[section].count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as? FriendCell {
if friendRequests.isEmpty {
let friendCell = friends[indexPath.row]
cell.configureProfileCell(friendCell)
} else {
if (indexPath.section == 0) {
let friendRequestCell = friendRequests[indexPath.row]
cell.configureRequestCell(friendRequestCell)
} else if (indexPath.section == 1) {
let friendCell = friends[indexPath.row]
cell.configureProfileCell(friendCell)
}
}
return cell
} else {
return FriendCell()
}
}
答案 1 :(得分:0)
您应该使用其他更新的出列方法:dequeReusableCellWithIdentifier(_:forIndexPath:)
代替(传递实际的索引路径)。
确保一个人永远成功,所以你可以不用这个if/else
结构:
if let cell = ... {
...
return cell
}
else {
return FriendCell()
}
顺便说一句,您正在返回FriendCell
实例,而不进行配置。那是你真正想要的吗?
<强>澄清强>
只有当一个或多个具有指定标识符的单元已经入队以供重用时,方法dequeReusableCellWithIdentifier(:)
才会成功;你调用它的前几次它将返回nil和你需要回退来实例化一个新的单元格(具有相同的标识符),以便立即使用(以后再使用):
func tableView(tableView:UITableView, cellForRowAtIndexPath:NSIndexPath) -> UITableViewCell
{
if let cell = tableView.dequeReusableCellWithIdentifier("Identifier") as? FriendCell {
// Successfully dequeued for reuse;
// configure it:
// (set labels' texts, etc.)
return cell
}
else{
// No cell enqueued; create anew
let cell = FriendCell(style:.Plain, reuseIdentifier:"Identifier")
// configure it
// (set labels' texts, etc.)
return cell
}
}
...但是因为这项检查很痛苦,Apple又添加了一种新方法:
dequeReusableCellWithIdentifier(identifier:String, forIndexPath:NSIndexPath)
在内部执行出队,也会在没有人可用时初始化新单元。这消除了上面代码中对else路径的需求,并且它变得更加智能:
func tableView(tableView:UITableView, cellForRowAtIndexPath:NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeReusableCellWithIdentifier("Identifier", forIndexPath:indexPath) as! FriendCell
// (Never fails - provided identifier is right and class is registered for it)
// configure it:
// (set labels' texts, etc.)
return cell
}