selectRowAtIndexPath未被调用

时间:2015-08-18 15:20:59

标签: ios objective-c uitableview asynchronous

我有一个允许用户将条目添加到服务器端表的类。一切正常,直到我尝试使用新数据刷新UITableView。我进行服务器调用以获取新数据集,使用它来刷新作为表的数据源的NSArray,然后尝试重新加载表。以下是从服务器返回数据时调用的方法:

- (void) logEntriesRefreshed : (NSNotification *) notification {

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:@"log_entries_refreshed"
                                                  object:nil];

    NSLog(@"returned from log entries fetch");

    _logEntriesArray = [LogEntriesDataFetcher getLogEntriesArray];
    [_tableView reloadData];

    _activityIndicator.hidden = YES;
    [_activityIndicator stopAnimating];

    NSLog(@"log entries array count: %lu", [_logEntriesArray count]);

    [_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
                            animated:NO
                      scrollPosition:UITableViewScrollPositionNone];
}

最后一行就是问题所在。我想以编程方式选择表中的第一行(必须至少有一行,因为我刚添加了一行)。但似乎这条线永远不会执行。请注意这个方法,下一步应该是:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"here");

    UITableViewCell *previousCell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:_previousIndexPath];
    previousCell.backgroundColor = [UIColor clearColor];
    previousCell.textLabel.textColor = [SharedVisualElements primaryFontColor];

    UITableViewCell *cell = (UITableViewCell *)[_tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [SharedVisualElements secondaryFontColor];
    cell.textLabel.textColor = [SharedVisualElements primaryFontColor];

    _previousIndexPath = indexPath;

    // get the file attributes for the cell just selected
    _currentEntry = (LogEntry *)[_logEntriesArray objectAtIndex:[indexPath row]];

    NSLog(@"array count: %lu", (unsigned long)[_logEntriesArray count]);
    NSLog(@"current entry: %ld", (long)[indexPath row]);

    _isExistingEntry = YES;
    _arrayPositionOfEntryBeingEdited = [indexPath row];

    [self initializeValues];
    [self initializeObjects];
    [self captureStartingValuesForStateMachine];
}

我在selectRowAtIndexPath行以及NSLog(@"here")中的第一个didSelectRow...行设置了断点。我到达selectRowAtIndexPath行,但从未使用didSelectRow方法。我的控制台输出与以下内容一致:

returned from log entries fetch
log entries array count: 7

这就是结束。 didSelectRow...方法没有任何内容。也没有抛出任何错误。

我错过了什么。看起来非常简单,但我所做的一切似乎都无法发挥作用。

1 个答案:

答案 0 :(得分:3)

根据Apple的文档,调用selectRowAtIndexPath不会调用didSelectRowAtIndexPath。看看here

  

调用此方法不会导致委托接收    tableView:willSelectRowAtIndexPath:或    tableView:didSelectRowAtIndexPath:消息,也不发送   向观察者发出UITableViewSelectionDidChangeNotification通知。

要专门调用didSelectRowAtIndexPath委托方法,请使用以下代码:

[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:indexPath];

希望这有帮助。