我有一个带有故事列表的UITableView,底部有一个加载更多故事的单元格。我试图让“更多故事...”单元格取消选择,并在单击时将其文本更改为“正在加载...”。我已经搜索了整个互联网和遍布stackoverflow,我无法弄清楚为什么我的代码不能正常工作。现在,当点击“更多故事...”单元格时,它会保持选中状态并且不会更改其文本。
对于那些要求,更多故事在表格视图的底部添加了25个新故事。
原始代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
if (storyIndex == [stories count]) {
UITableViewCell *moreCell = [tableView dequeueReusableCellWithIdentifier:@"more"];
if (moreCell == nil) {
moreCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"more"] autorelease];
} // Set up the cell
moreCell.textLabel.text = @"Loading...";
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[self moreStories];
} else {
NSLog(@"%@",[[stories objectAtIndex: storyIndex] objectForKey: @"link"]);
webViewController *webController;
webController = [[webViewController alloc] initWithURLPassed:[[stories objectAtIndex: storyIndex] objectForKey: @"link"]];
[self.navigationController pushViewController:webController animated:YES];
[webController release];
webController =nil;
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
}
}
已更新,但仍无法正常使用。现在它最终取消选择单元格并将文本更改为“正在加载...”,但只有在更多故事完成下载所有故事之后。显然,我希望在下载故事时文本为“正在加载...” 1/4/10~9pm
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
if (storyIndex == [stories count]) {
UITableViewCell *moreCell = [tableView cellForRowAtIndexPath:indexPath];
moreCell.textLabel.text = @"Loading...";
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSArray *arr = [[NSArray alloc] initWithObjects:indexPath,nil];
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
[self moreStories];
} else {
NSLog(@"%@",[[stories objectAtIndex: storyIndex] objectForKey: @"link"]);
webViewController *webController;
webController = [[webViewController alloc] initWithURLPassed:[[stories objectAtIndex: storyIndex] objectForKey: @"link"]];
[self.navigationController pushViewController:webController animated:YES];
[webController release];
webController =nil;
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
}
}
答案 0 :(得分:2)
[tableView dequeueReusableCellWithIdentifier:@"more"]
告诉表视图为您提供一个不同的单元格,一个位于重用队列中的单元格以及显示的内容。此外,当没有可重复使用的单元格可用于出列时,moreCell == nil
条件会生成全新的单元格。此模式仅供表格视图数据源在生成用于显示的表格单元格时使用。
您需要使用[tableView cellForRowAtIndexPath:indexPath]
来获取实际选中的单元格。
UITableViewCell *moreCell = [tableView cellForRowAtIndexPath:indexPath];
moreCell.textLabel.text = @"Loading...";
编辑:根据您的更新看起来,正如aBitObvious在评论中所说,网址加载请求阻止了UI的更新。在更新UI时,请尝试启动一个新线程并在该线程中加载数据,以便您的UI可以不受干扰地更新。
答案 1 :(得分:0)
我继续前进,为你想要完成的事情做了一个非常简单的版本。看看这有什么用处。我实现这一目标的方式是我继续改变UITableView的数据源。最终你可能正在做什么来加载更多的故事。要记住的关键是,如果要更改数据源,则需要重新加载tableView。
- (void)viewDidLoad {
NSArray *array = [[NSArray alloc] initWithObjects:@"Story 1", @"Story 2", @"Story 3", @"Story 4", @"Story 5", @"More Stories", nil];
self.stories = array;
[array release];
[super viewDidLoad];
}
// TableView数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [stories count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease];
}
cell.textLabel.text = [stories objectAtIndex:[indexPath row]];
return cell;
}
// TableView委托方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ([indexPath row] == [stories count] - 1) {
//Get more stories
[table deselectRowAtIndexPath:indexPath animated:YES];
NSArray *array = [[NSArray alloc] initWithObjects:@"Story 1*", @"Story 2*", @"Story 3*", @"Story 4*", @"Story 5*", @"Loading...", nil];
self.stories = array;
[array release];
NSArray *arr = [[NSArray alloc] initWithObjects:indexPath,nil];
[table beginUpdates];
[table reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationFade];
[table endUpdates];
}
else {
//Call your methods to load the stories.
}