Objective c 表视图数据加载问题

Objective c 表视图数据加载问题,objective-c,ios,xcode,Objective C,Ios,Xcode,我对表视图有疑问。我已在“表视图”单元格中放置了标签和开关。默认情况下,我将开关值设置为否。现在,当在模拟器中加载表视图时,表视图显示的开关没有值。现在我选择开关值为是。但是,当滚动表视图时,表视图使用“出列可重用单元方法”属性。现在,每次都将重新加载对象。开关值是多少?是否还是是?将是是。 关于滚动tableview还有一件事,它不调用重载方法。如果您使用的是deque Reusables cell method属性,那么它只是重用已经创建的tableview单元格。当滚动表格视图时,Tabl

我对表视图有疑问。我已在“表视图”单元格中放置了标签和开关。默认情况下,我将开关值设置为否。现在,当在模拟器中加载表视图时,表视图显示的开关没有值。现在我选择开关值为是。但是,当滚动表视图时,表视图使用“出列可重用单元方法”属性。现在,每次都将重新加载对象。开关值是多少?是否还是是?

将是是。
关于滚动tableview还有一件事,它不调用重载方法。如果您使用的是deque Reusables cell method属性,那么它只是重用已经创建的tableview单元格。

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

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

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

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

-(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来标识每个开关应为是或否的行:

// 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
}

希望对您有所帮助。

为了保证没有重复的单元格: 在中使用此代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
详情如下:

for(UIView *v in [cell subviews])
{
    if([v isKindOfClass:[UILabel class]] ||[v isKindOfClass:[UISwitch class]])
        [v removeFromSuperview];
}

请在你的问题中添加一些代码。很难看出你具体在问什么。前三段完全错了,然后你就开始有意义了。细胞不会被破坏和重建,这就是关键所在。它们被重复使用。因此,您需要一个模型结构,并且每次都要从模型中设置开关状态。@jrturton yes绝对正确。解决这个问题的简单方法之一就是为每个单元格设置不同的-2 CellIdentifier,就像我在回答中所做的那样