来自另一个 UIVIewController 的 selectRowAtIndexPath 不起作用
Posted
技术标签:
【中文标题】来自另一个 UIVIewController 的 selectRowAtIndexPath 不起作用【英文标题】:selectRowAtIndexPath from another UIVIewController not working 【发布时间】:2014-04-12 01:46:44 【问题描述】:我正在尝试在 UITableView 上调用 selectRowAtIndexPath,该 UITableView 是我从中调用它的 UIViewController 的子视图。
我已经设置好了,当你选择一个单元格时,它会变成灰色,这很好,但是我正在将不同的数据集加载到 UITableView 中和从 UITableView 中加载出来,并且每当进行选择时,我都会将选定的 NSIndexPath 发送回UIViewController。然后,当视图下一次加载正确的 NSIndexPath 数据集时,我会从 UIViewController 调用此方法。
if (codeIndexPath != nil)
[filterViewController.tableView selectRowAtIndexPath:codeIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
然后在 UITableView 类中,我的 cellForRowAtIndexPath 和 didSelectRowAtIndexPath 看起来像这样。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
// Configure the cell...
NSString *projectDescriptionString = [currentFilterMutableArray objectAtIndex:indexPath.row];
cell.textLabel.text = projectDescriptionString;
if (indexPath == currentlySelectedIndex)
cell.highlighted = YES;
else if (indexPath == currentlySelectedIndex)
cell.highlighted = NO;
return cell;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
// send this data back in the delegate so you can use it to show where the tick is again if you need too.
currentlySelectedIndex = indexPath;
[[self delegate] updateInstallTableWithFilter:[currentFilterMutableArray objectAtIndex:indexPath.row] FilterType:filterType InstallIndex:indexPath];
当它在屏幕上加载时,正确的单元格将突出显示一秒钟然后变回白色。
更新
cellForRowAtIndexPath 中的新 if 语句
if ([indexPath isEqual:currentlySelectedIndex])
cell.highlighted = YES;
else if (![indexPath isEqual:currentlySelectedIndex])
cell.highlighted = NO;
我仍然收到同样的错误。
【问题讨论】:
您不应该将 indexPaths 与“==”进行比较,因为它们是对象。你应该使用 isEqual: 代替。 不仅 if 和 else if 都是 == 哈哈错过了那个.. 我更新了它.. 将在几秒钟内显示新代码。 【参考方案1】:UITableViewController 有一个名为clearsSelectionOnViewWillAppear
的属性。 From the doc:
当表格视图第一次加载时即将出现时, 表视图控制器重新加载表视图的数据。它也清除 它的选择(有或没有动画,取决于请求) 每次显示表格视图时。 UITableViewController 类在超类方法 viewWillAppear: 中实现了这一点。你 可以通过更改中的值来禁用此行为 清除SelectionOnViewWillAppear 属性。
所以在那个表视图控制器子类中,在 viewDidLoad...
- (void)viewDidLoad
[super viewDidLoad];
self.clearsSelectionOnViewWillAppear = NO;
【讨论】:
哇..我一直在尝试很多东西,我有点迷失在这一切中......哦,我今天学到了一些新东西,希望下次我能记住它。大声笑非常感谢你的帮助。以上是关于来自另一个 UIVIewController 的 selectRowAtIndexPath 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
从 UIViewController 转到 UITableViewController
将 UIViewController 类文件导入 AppDelegate
从另一个 UIViewController 呈现 UIViewController
UIViewController 拥有另一个 UIViewController