是否可以替换所选单元格的单元格视图?我已将我的控制器注册为数据源和委托.对单元格视图,行号,选择状态等的请求都很好.在单元格选择回调中,我试图让表格视图用新视图重新加载单元格(而不是实际数据!).基本上,我希望单元格视图展开并显示更多基础数据(如果已选中).问题是我不知道如何使表视图向我的控制器询问新视图.我可以看到视图正在请求单元格高度,但仅此而已.
在视图上调用reloadData可以正常工作,但它效率低下并且带有一系列自己的问题(动画可能性,维护选择状态等).
解决方法
这是我要采取的方法.
@property (nonatomic,strong) NSIndexPath *selectedindexPath;
将NSIndexPath类型的属性设置为控制器以存储选择的索引路径.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.selectedindexPath = indexPath;
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationNone];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([indexPath compare:self.selectedindexPath] == NSOrderedSame) {
// Create your custom cell here and return it.
}
else {
// Should create a normal cell and return it.
}
}
究竟.另请注意,您可能想要取消选择.这是Swift中的完整代码.根据需要在cellForRowAtIndexPath中使用selectedindexPath.
//选择TableViewController
导入UIKit
class SelectingTableViewController:UITableViewController
{
内部var selectedindexPath:NSIndexPath? =没有
override func viewDidLoad()
{
super.viewDidLoad()
tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension
self.cleaRSSelectionOnViewWillAppear = false;
}
override func tableView
(tableView:UITableView,didSelectRowAtIndexPath indexPath:NSIndexPath)
{
print("did select....")
// in fact,was this very row selected,// and the user is clicking to deselect it...
// if you don't want "click a selected row to deselect"
// then on't include this clause.
if selectedindexPath == indexPath
{
print("(user clicked on selected to deselect)")
selectedindexPath = nil
tableView.reloadRowsAtIndexPaths(
[indexPath],withRowAnimation:UITableViewRowAnimation.None)
tableView.deselectRowAtIndexPath(indexPath,animated:false)
return
}
// in fact,was some other row selected??
// user is changing to this row? if so,also deselect that row
if selectedindexPath != nil
{
let pleaseRedrawMe = selectedindexPath!
// (note that it will be drawn un-selected
// since we're chaging the 'selectedindexPath' global)
selectedindexPath = indexPath
tableView.reloadRowsAtIndexPaths(
[pleaseRedrawMe,indexPath],withRowAnimation:UITableViewRowAnimation.None)
return;
}
// no prevIoUs selection.
// simply select that new one the user just touched.
// note that you can not use Apple's willdeselectRowAtIndexPath
// functions ... because they are freaky
selectedindexPath = indexPath
tableView.reloadRowsAtIndexPaths(
[indexPath],withRowAnimation:UITableViewRowAnimation.None)
}
}