xCode:UITableView 无法查看/访问所有单元格

Posted

技术标签:

【中文标题】xCode:UITableView 无法查看/访问所有单元格【英文标题】:xCode: TableView cant see/acces all cells 【发布时间】:2014-08-13 19:19:57 【问题描述】:

当我按下一个名为“AllOK”的按钮时,我希望 object.selectedIndex 为 0。这与可见的单元格完美配合。但它不会访问在应用程序/屏幕上不可见的单元格。如果您向下滚动并看到它们,它会检查它们,但我希望它这样做,而不必向下滚动。

有谁知道如何让 tableview 知道它“也”得到了它看不到的单元格?

我的表格视图和按钮的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FancyCell"];
    cell = nil;
    if (!cell) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FancyCell"];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        // add the segmentedControl when you create a new cell
        UIImage *correctImageGreen = [[UIImage imageNamed:@"green.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        UIImage *correctImageGul = [[UIImage imageNamed:@"gul.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        UIImage *correctImageRed = [[UIImage imageNamed:@"red.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        UIImage *correctImageGray = [[UIImage imageNamed:@"gray.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        NSArray *itemArray = [NSArray arrayWithObjects: correctImageGreen, correctImageGul, correctImageRed, correctImageGray, nil];
        UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
        segmentedControl.frame = CGRectMake(310, 7, 150, 30);
        [cell.contentView addSubview:segmentedControl];

        // add an action so we can change our model if the view changes
        [segmentedControl addTarget:self action:@selector(didChangeSegmentedControl:) forControlEvents:UIControlEventValueChanged];

        // use a tag so we can retrieve the segmentedControl later
        segmentedControl.tag = 42;
    
    // either if the cell could be dequeued or you created a new cell,
    // segmentedControl will contain a valid instance
    UISegmentedControl *segmentedControl = (UISegmentedControl *)[cell.contentView viewWithTag:42];

    UIImage *comment = [UIImage imageNamed:@"Checkmark-hvid"];
    UIImage *imageRef = [UIImage imageNamed:@"Checkmark-hvid"];
    UIImageView *commentView = [[UIImageView alloc] initWithImage: comment];
    UIImageView *imageRefView = [[UIImageView alloc] initWithImage: imageRef];
    commentView.frame = CGRectMake(625, 5, 30, 30);
    imageRefView.frame = CGRectMake(515, 5, 30, 30);
    commentView.tag = 98;
    imageRefView.tag = 99;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    boolean_t didGetStates = [defaults boolForKey:@"didGetStates"];

    MBFancyObject *object = _objects[indexPath.row];
    if (didGetStates) 

        // State
        NSDictionary *dic = [tableData objectAtIndex:indexPath.row];
        if (object.beingEdited == -1) 
            int selectedState = [[dic valueForKey:@"State"] intValue];
            object.selectedIndex = selectedState;
        

        // Comment & ImageRef
        int comment = [[dic valueForKey:@"Comment"] intValue];
        int imageRef = [[dic valueForKey:@"Foto"] intValue];
        if (comment == 0) 
            [cell.contentView addSubview:commentView];
        
        else 
            [[cell.contentView viewWithTag:98]removeFromSuperview];
        
        if (imageRef == 0) 
            [cell.contentView addSubview:imageRefView];
        
        else 
            [[cell.contentView viewWithTag:99]removeFromSuperview];
        

    
    cell.textLabel.text = object.title;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    segmentedControl.selectedSegmentIndex = object.selectedIndex;
    object.currentIndexRow = indexPath.row;
    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.textColor = [UIColor whiteColor];

    return cell;


- (IBAction)allOK:(id)sender 
    for (MBFancyObject *object in _objects) 
        object.selectedIndex = 0;
        object.beingEdited = 0;
    
    [[self tableView] reloadData];

【问题讨论】:

因此只有当单元格在屏幕上可见时才会调用 cellForRowAtIndexPath。您可能需要其他类型的初始化才能正常工作 嗨。感谢您的输入!我对开发应用程序相当陌生,我想知道您是否可以告诉我应该使用哪个初始化? :-) 谢谢 【参考方案1】:

所以我在第一次评论时没有注意到这一点,但你的问题很明显。您没有正确地将单元格从单元池中出列,因此当您滚动时,您每次都在创建一个全新的单元格,这会导致它们无法按照您想要的方式使用您选择的索引。我很确定您的解决方案就在这里:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FancyCell"];
cell = nil;
if (!cell) 

您正在正确地将单元格出列,但随后立即将其设置为 nil,这意味着它将始终通过 !cell 检查并始终创建一个新单元格。尝试删除此行并使用出队的单元格。

编辑:

由于没有这样做,这就是我要尝试的其他方法: 创建对方法willDisplayCell:forRowAtIndexPath: 的调用,并在此调用中检查您设置的布尔标志,以查看该索引处的分段控件是否应位于索引0。所以基本上每当要显示一个单元格时,你检查它的分段控件是否应该设置为索引 0,如果应该,将它的索引设置为 0。

【讨论】:

您好。我试图删除单元格 = nil;行,但仍然无法正常工作;-(您还有其他建议如何解决此问题?也许只是一个在视图加载时向下滚动然后备份的功能?:) 您可以做的一件事,虽然我不确定它的解决方案有多棒,但您可以在 viewDidLoad 方法中初始化一个分段控件数组。这样,当您按下 AllOk 时,您只需通过并将所有这些设置为正确的值。然后,在 cellForRowAtIndexPath 方法中,您只需对位于的索引进行分段控制。 正如我所提到的,我对编写 ios 应用程序还很陌生,因此我想知道您是否愿意帮助我。要么给我一些代码,或者如果你想然后使用teamviewer? :-) 谢谢 我知道你是新手,所以让我更清楚一点。您目前有 viewDidLoad 的实现吗?如果你不这样做,那么你需要做的就是通过调用 [super viewDidLoad] 来添加它(确保你有这个!),然后添加你自己的代码。你了解 UISegmentedControls 数组的概念吗?我要问你的一个问题是你的对象数组有多大,它是固定的还是可变的? 我目前有 viewDidLoad 实现。我没有得到 UISegmentedControls 的数组 :-( 对象数组中的对象数量是可变的,但在 15 到 25 之间。感谢 agian。

以上是关于xCode:UITableView 无法查看/访问所有单元格的主要内容,如果未能解决你的问题,请参考以下文章

XCode:无法在 UIViewController 中嵌入 UITableview

UITableView 内的 UIScrollView 无法正确显示/隐藏(Xcode iPhone)

更新到 Xcode7-beta4 后,无法在属性检查器中设置 UITableView 的 backgroundColor 属性

Xcode UI 测试 - UITableView 部分

UITableView 不再使用 xCode 4.5 滚动,部署在 5.x 或 6.0

如何在 Xcode 中设置 UITableView 部分标题渐变(和透明)背景?