IAm*_*dge 2 iphone uitableview
我正在制作一个iPhone应用程序,其部分界面与iPhone YouTube应用程序的"最受欢迎"部分完全相同.
这个"热门"部分可从底部的标签栏访问,顶部的导航栏包含一个UISegmentedControl,可选择"今天,本周,月等".
因为大多数应用程序都包含UITableViews,其中单元格包含非常相似的结构化内容,所以我创建了一个继承UITableViewController的通用MyAppTableViewController.我的" 流行 "部分因此由一个的PopularTableViewController它继承MyAppTableViewController.实际的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];
}
(还有其他方法可以更新表视图从中获取数据的数据结构)
我已将控制台输出代码放入xml解析方法中,并且在运行时,选择不同的段会导致正确解析正确的xml文件,并且数据结构似乎包含正确的值.
问题是表格单元格的内容不会改变!GRR!除非!...一个单元格滚出视图,然后返回视图......然后它被改变了!
我已经做了很多关于这个问题的搜索,并且针对类似问题的一个建议是将[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上,单元格是完整视图(与Mac不同),因此如果您想要更改其数据,只需更改其数据和调用即可-setNeedsDisplay.您可以使用获取给定位置的单元格(视图)-cellForRowAtIndexPath:.您可以使用-indexPathsForVisibleRows或确定给定单元格是否在屏幕上-visibleCells.
很少需要打电话-reloadData.只有在丢弃所有内容并加载完全不同的数据时才应该这样做.相反,您应该使用插入/删除例程来添加/删除行,您应该只在数据更改时更新现有行的视图.
| 归档时间: | 
 | 
| 查看次数: | 7427 次 | 
| 最近记录: |