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,就像我在回答中所做的那样