0

我对表格视图有疑问。我在表格视图单元格中放置了一个标签和开关。我默认将开关值设置为 NO。现在,当在模拟器中加载表视图时,表视图会显示带有 NO 值的开关。现在我选择开关值为YES。但是表格视图使用出列可重用单元格方法 滚动表格视图时的属性 现在每次都会重新加载对象 开关值是 NO 还是 YES?

4

3 回答 3

1

是的。滚动表格视图的另一件事是它不调用 reload 方法。如果您使用双端队列可重用单元格方法属性,它只是重用已创建的表格视图单元格。

于 2012-10-21T06:55:21.423 回答
-1

保证没有重复的单元格:在

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

如下 :

for(UIView *v in [cell subviews])
{
    if([v isKindOfClass:[UILabel class]] ||[v isKindOfClass:[UISwitch class]])
        [v removeFromSuperview];
}
于 2012-10-21T08:44:24.583 回答
-1

当表格视图滚动时,TableViewCells 会在必要时被销毁和创建。

当一个单元格在离开可见屏幕区域时被破坏时,作为单元格子视图的开关控件也会被破坏。

因此,当您滚动回之前设置的开关之一时,您实际上看到的是 UITableViewCell 的另一个实例,其中添加了一个开关视图,因此看起来开关值变回了 NO。

您需要的第三件事是记住每行中每个开关的值应该是什么。如果您要显示核心数据实体信息表,那么也许您可以为您的实体定义一个属性,例如“活动”。在这种情况下,每次更改开关值时,都会将核心数据实体“活动”属性设置为开关值,例如:

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

    if(cell == nil)
    {
        // set switch control tag number (don't use 0)
    }

    // get switch control by tag number

    // pseudocode
    Engine *myEngine = [arrEngine objectAtIndex:indexPath.row];

    mySwitchControl.active = myEngine.active;

    ...
}

// when you change switch value, remember to update your core data entity value
-(void)updateSwitchValue:(BOOL) newValue
{
    // update value
}

否则,您可以简单地使用布尔值的 NSMutableArray 来确定每个开关的哪一行应该是 YES 或 NO:

// my header file (.h file)
@interface
{
    NSMutableArray *arrSwitchValues;
}

// my implementation file (.m file)
-(UITableViewCell *)tableView:(UITableView)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...

    if(cell == nil)
    {
        // set switch control tag number (don't use 0)
    }

    // get switch control by tag number

    // pseudocode
    BOOL switchVal = [arrSwitchValues objectAtIndex:indexPath.row];

    mySwitchControl.active = switchval;

    ...
}

// when you change switch value, remember to update your array
-(void)updateSwitchValue:(BOOL) newValue
{
    // update value
}

希望有帮助。

于 2012-10-21T08:01:11.547 回答