我目前正在制作一个显示用户个人资料的应用。为此,我使用了一个UITableViewCell,其中包含用于不同类型数据(电话号码,邮件地址等)的自定义单元格。每个配置文件最多有8个单元格。
允许用户以最简单的方式编辑其个人资料。触发tableview的编辑模式后,所有可编辑标签都将替换为文本字段。然后在修改完成后转回标签。
Homever,似乎没有可见的细胞存在问题。每次它们重新出现在视图中时,它们都会重新加载,再次触发setEditing:YES方法等等......因此,文本字段中的每个更改都会丢失。
有没有办法阻止tableview删除不可见的单元格并将它们添加回去?只有八个单元格,所以它不会消耗很多资源,而且每次进行更改时我都不必保存它们的状态。
PS:我已经尝试了dequeueReusableCellWithIdentifier方法和每个单元格的标识符,但我还没有达到我想要的效果。每次我隐藏一个单元格,其内容都会刷新。
答案 0 :(得分:3)
您应该使用静态单元格而不是动态单元格。选择表格视图并更改配置,如图像。
在界面构建器中添加单元格!
答案 1 :(得分:1)
在这种情况下,UITableView的可重用性没有帮助(在大多数情况下,可重用性是一件好事),但在保留编辑方面会有太多困难。因此,您可以避免重复使用并事先准备好您的细胞。
在ViewController中添加NSMutableArray
iVar或属性
@property (nonatomic, strong) NSMutableArray *cells;
在您的viewDidLoad中:准备cells
,而不是reuseIdentifier
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
//Creates tableView cells.
[self createCells];
}
- (void)createCells
{
self.cells = [NSMutableArray array];
TCTimeCell *cellCallTime = [[TCTimeCell alloc] initWithTitle:@"CALL" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeCall];
[_cells addObject:cellCallTime];
TCTimeCell *cellLunchOut = [[TCTimeCell alloc] initWithTitle:@"LUNCH START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchOut];
[_cells addObject:cellLunchOut];
TCTimeCell *cellLunchIn = [[TCTimeCell alloc] initWithTitle:@"LUNCH END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeLunchIn];
[_cells addObject:cellLunchIn];
TCTimeCell *cellSecondMealOut = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL START" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealOut];
[_cells addObject:cellSecondMealOut];
TCTimeCell *cellSecondMealIn = [[TCTimeCell alloc] initWithTitle:@"2ND MEAL END" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeSecondMealIn];
[_cells addObject:cellSecondMealIn];
TCTimeCell *cellWrapTime = [[TCTimeCell alloc] initWithTitle:@"WRAP" forTimecard:_timecard andTimeEntryType:TCTimeEntryTypeWrap];
[_cells addObject:cellWrapTime];
}
您可以从此数组中填充tableView。
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.cells.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return self.cells[indexPath.row];
}
如果您有分区的tableView,则可以将单元格准备为array of arrays
。在这种情况下,您的数据源方法应如下所示
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{
return [self.cells count];
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.cells[section] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return self.cells[indexPath.section][indexPath.row];
}