gpt4 book ai didi

iphone - UITableView 将无法正确更新(即使调用 reloadData)

转载 作者:行者123 更新时间:2023-12-03 20:38:19 24 4
gpt4 key购买 nike

我正在制作一款 iPhone 应用程序,其界面的一部分与 iPhone YouTube 应用程序的“最受欢迎”部分完全相同。

可以通过底部的选项卡栏访问此“热门”部分,顶部的导航栏包含一个UISegmentedControl,用于选择“今天、本周、本月等”。

由于应用程序的大部分由 UITableView 组成,单元格包含非常相似的结构内容,因此我创建了一个继承 UITableViewController 的通用 MyAppTableViewController。因此,我的“popular”部分由继承MyAppTableViewControllerPopularTableViewController组成。实际的 UITableView 位于 MyAppTableViewController 中。

PopularTableViewController 有方法:

- (void) segmentChangeTimeframe:(id)sender {
UISegmentedControl *segCtl = sender;
if( [segCtl selectedSegmentIndex] == 0 )
{
// Call [self parse-xml-method-which-resides-in-MyAppTableViewController]
}
//... ... ...
}

MyAppTableViewController 使用 NSXMLParser,因此具有代码:

- (void)parserDidEndDocument:(NSXMLParser *)parser {
[self.myTableView reloadData];
}

(还有其他方法可以更新 TableView 从中获取数据的数据结构)

我已将控制台输出代码放入 xml 解析方法中,运行时,选择不同的段会导致正确解析正确的 xml 文件,并且数据结构似乎包含正确的值。

问题是表格单元格的内容不会改变!哎呀!除非!...一个单元格滚动到 View 之外,然后又回到 View 中...然后它就改变了!

我已经做了很多关于这个问题的搜索,对于类似问题的一个建议是将 [self.myTableView reloadData] 放入它自己的方法中,例如myReloadDataMethod 然后使用:

[self performSelectorOnMainThread:@selector(myReloadDataMethod) withObject:nil waitUntilDone:NO];

我尝试将上面的代码放入 parserDidEndDocument 方法中,但它完全没有任何区别!我完全被难住了,想知道是否有人知道这里发生了什么。

更新:

填充单元格的代码是这样完成的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier] autorelease];
}

// Set up the cell
int itemIndex = [indexPath indexAtPosition: [indexPath length] - 1];
NSString *artistName = [[myItemList objectAtIndex: itemIndex] objectForKey: @"itemA"];
NSString *mixName = [[myItemList objectAtIndex: itemIndex] objectForKey: @"itemB"];
cell.textLabel.text = itemA;
cell.detailTextLabel.text = itemB;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

return cell;
}

上面的代码位于 MyAppTableViewController 中,这也是 myItemList 所在的位置。

最佳答案

您的-performSelectorOnMainThread:代码适用于您在后台线程上更改模型类时。 UI 事件(包括 -reloadData)需要在主线程上发生。如果您不使用后台线程,则这是不必要的。如果是的话,类似的事情是强制性的。

如果您要更改特定单元格的值,实现此目的的方法是更改​​单元格本身。在 iPhone 上,单元格是完整 View (与 Mac 不同),因此如果您想更改其数据,只需更改其数据并调用 -setNeedsDisplay 即可。您可以使用 -cellForRowAtIndexPath: 获取给定位置的单元格( View )。您可以使用 -indexPathsForVisibleRows-visibleCells 确定给定单元格是否在屏幕上。

很少需要调用-reloadData。仅当您丢弃所有内容并加载完全不同的数据时才应该这样做。相反,您应该使用插入/删除例程来添加/删除行,并且应该在数据更改时更新现有行的 View 。

关于iphone - UITableView 将无法正确更新(即使调用 reloadData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294699/

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