gpt4 book ai didi

ios - UITableView,在选择时替换单元格 View

转载 作者:可可西里 更新时间:2023-11-01 03:37:32 25 4
gpt4 key购买 nike

是否可以替换所选单元格的单元格 View ?我已将我的 Controller 注册为数据源和委托(delegate)。对单元格 View 、行号、选择状态等的请求都很好。在单元格选择回调中,我试图让 TableView 使用新 View (不是实际数据!)重新加载单元格。基本上,我希望单元格 View 展开并显示更多基础数据(如果它被选中)。问题是我不知道如何让 TableView 向我的 Controller 询问新 View 。我可以看到 View 正在请求单元格高度,但仅此而已。

在 View 上调用 reloadData 是可行的,但它效率低下并且有一系列自身的问题(动画可能性、维护选择状态等)。

最佳答案

这是我将采用的方法。

@property (nonatomic, strong) NSIndexPath *selectedIndexPath;

将 NSIndexPath 类型的属性设置到您的 Controller 以存储选择的索引路径。

- (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

类 SelectingTableViewController: UITableViewController
{ 内部变量 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)

}

}

关于ios - UITableView,在选择时替换单元格 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com