自定义单元格的表视图
我有我的应用程序中的自定义单元格的tableview和每个单元格包含两个复选框按钮。自定义单元格的表视图
问题是,当一个滚动事件触发(向上或向下)时,它正在重新加载tableview。因此,复选框按钮变为初始状态。
请给我一个解决方案。
谢谢你
那么你不应该使用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;
}
可以为您节省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];
}
}
我认为这个答案需要更多的信息才能有用。你能否添加更多细节,例如“我要添加目标?”或者可能是“如何在设置后使用这些信息?”。基本上,我认为你使用的是基于这个问题的高级概念,可能超出了OP的Obj-C技能(没有进一步的解释)。 – mbm29414
你将不得不自己维护一个列表来确定哪些小区应检查与否。请记住,在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
非常感谢您的帮助,我使用单独的类来定制单元格。我的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
是否使用cellForRowAtIndexPath
。如果是的话,而不是
static NSString [email protected]"CellIdentifier"
使用
NSString *CellIdentifier=[NSString string[email protected]"CellIdentifier%d",indexPath.row];
可以采取另一种方法是指定标签checkboxbuttons和采取的appDelegate文件中的一个字典和复选框设定值tag.initially你可以通过设置是或者选中或取消选中,然后在cellforrowatindexpath方法中设置值。根据appdelegate dictionary设置复选框的值。当用户选择或取消选择按钮时,更新appdelegate字典中的状态。
你对你的单元格使用'dequeueReusableCellWithIdentifier'方法吗? – beryllium
是的,我正在使用dequeueReusableCellWithIdentifier。是这样吗? – sajaz