2011-09-01 172 views
1

我有我的应用程序中的自定义单元格的tableview和每个单元格包含两个复选框按钮。自定义单元格的表视图

问题是,当一个滚动事件触发(向上或向下)时,它正在重新加载tableview。因此,复选框按钮变为初始状态。

请给我一个解决方案。

谢谢你

+0

你对你的单元格使用'dequeueReusableCellWithIdentifier'方法吗? – beryllium

+0

是的,我正在使用dequeueReusableCellWithIdentifier。是这样吗? – sajaz

回答

0

您应该在数据源中设置按钮的状态,并在创建单元格时加载此状态。我写了一个small Xcode project来证明这一点。

0

那么你不应该使用TableView作为数据源。

每当单元格进入视图时,UITableViewDataSource都会被要求提供UITableViewCell作为indexpath。

- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath 

在为方法,你应该设置复选框的状态,因为它是反映在您的数据源。 当复选框被更改时,将其保存在数据源中并且处于选定状态。

例子:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellIdentifier = @"CheckedTableViewCell"; 

    CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; 
     cell = (CheckedTableViewCell *)self.nibCell; 
     self.nibCell = nil; 
    } 

    item *item = [self objectAtIndexPath:indexPath]; 

    cell.titleLabel.text = item.title; 
    cell.switch.on = item.selected; 

    return cell; 
} 
+0

感谢您的帮助。但在使用if(!cell)时存在问题{[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; cell =(CheckedTableViewCell *)self.nibCell; self.nibCell = nil; },因为每次滚动tabelview时,它都会创建一个类似于已选中单元格的新单元格。 – sajaz

+0

您是否在nib中为“UITableViewCell”设置了cellIdentifier。 – rckoenes

0

可以为您节省NSUserDefaults的中的状态时,右键单击它。只需添加一个目标与@selector(changedOne:)并添加无效声明:

- (void)changedOne: (id)sender { 
    NSUserDefaults *df = [NSUserDefaults standardUserDefaults]; 
    NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row]; 
    if (sender.on) { 
     [df setBool:YES forKey:row]; 
    } 
    else { 
     [df setBool:NO forKey:row]; 
    } 
} 
+0

我认为这个答案需要更多的信息才能有用。你能否添加更多细节,例如“我要添加目标?”或者可能是“如何在设置后使用这些信息?”。基本上,我认为你使用的是基于这个问题的高级概念,可能超出了OP的Obj-C技能(没有进一步的解释)。 – mbm29414

1

你将不得不自己维护一个列表来确定哪些小区应检查与否。请记住,在tableView:cellForRowAtIndexPath:中,正确的实现将回收单元,以便永远不会有超过10-15个单元实例化。如果你没有正确处理,这可能会导致一些时髦的结果。当我做了一个糟糕的实现时,我发现某些单元特性“从一个单元传递到另一个单元”。

总之,这里是我建议(基于我想你问):
1.创建一个类来支持每个UITableViewCell的
2.创建一个属性在类,以确定哪些应该检查两个复选框(或两者都不)。
3.在您的ViewController/TableViewController中,维护一个NSMutableArray/NSArray,其中UITableView中array = 1单元格中的1项。
4.在您的tableView:cellForRowAtIndexPath:方法中,获取对阵列中相应项目的引用。
5.然后,检查该实例的属性并适当设置复选框值。


示例代码:

TableView.h

@interface TableView : UITableViewController 

@property (strong, nonatomic) NSMutableArray *itemArray; 

@end 

TableView.m

@implementation TableView 

@synthesize itemArray; 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Assume you get a valid, custom UITableViewCell at this point (named "cell") 

    // Configure the cell... 
    NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]]; 
    [[cell checkBox1] setChecked:[classItem checkbox1Checked]]; 
    [[cell checkBox2] setChecked:[classItem checkbox2Checked]]; 

    return cell; 
} 

@end 
+0

非常感谢您的帮助,我使用单独的类来定制单元格。我的cellForRowAtIndexPath:(NSIndexPath *)indexPath方法是这样的。 NSString * CustomCellIdentifier = @“CustomCellIdentifier”; CustomCell * cell =(CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier]; \t \t 如果(细胞==无){ \t \t的NSArray *笔尖= [[一个NSBundle mainBundle] loadNibNamed:@ “CustomCell” 所有者:自选项:无]; \t \t为(在笔尖ID oneObject)如果([oneObject isKindOfClass:[CustomCell类]]) \t \t \t细胞=(CustomCell *)oneObject; \t} – sajaz

0

是否使用cellForRowAtIndexPath。如果是的话,而不是

static NSString [email protected]"CellIdentifier" 

使用

NSString *CellIdentifier=[NSString string[email protected]"CellIdentifier%d",indexPath.row]; 

可以采取另一种方法是指定标签checkboxbuttons和采取的appDelegate文件中的一个字典和复选框设定值tag.initially你可以通过设置是或者选中或取消选中,然后在cellforrowatindexpath方法中设置值。根据appdelegate dictionary设置复选框的值。当用户选择或取消选择按钮时,更新appdelegate字典中的状态。

+0

嗨,我不明白什么是使用这个效果,请告诉我。非常感谢 – sajaz

+0

你不应该这样做,这将使TableView反应非常缓慢,滚动会滞后。 – rckoenes

+0

如果你使用静态CellIdentifier,那么这个标识符将被用于下一行。但是如果你创建%d,那么将为每一行创建不同的标识符,但是由于rckoess表示滚动将会变慢。 – Bhoomi

相关问题