我正在使用自定义UITableViewCell进行编辑。当我进入编辑模式时,标签和图像无法正常移动。
- (IBAction) EditTable:(id)sender{
UIButton *btn = (UIButton *)sender;
if(self.editing) {
[super setEditing:NO animated:NO];
[btn setTitle:@"edit" forState:UIControlStateNormal];
[tblView setEditing:NO animated:NO];
} else {
[super setEditing:YES animated:YES];
[btn setTitle:@"done" forState:UIControlStateNormal];
[tblView setEditing:YES animated:YES];
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int count = [arrData count];
if(self.editing) [arrData count];
return count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
DeleteUserCell *cell = (DeleteUserCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DeleteUserCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.imgCell.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d", indexPath.row+1]];
cell.lblCell.text = [arrData objectAtIndex:indexPath.row];
return cell;
}
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
[arrData removeObjectAtIndex:indexPath.row];
[tblView reloadData];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
答案 0 :(得分:13)
您应该将所有自定义单元格的子视图添加到单元格的视图中,而不是单元格的contentView
。
如果您通过Interface Builder创建自定义单元格,则可以轻松地在界面构建器中找到自定义单元格的contentView
。否则,如果没有Interface Builder,请检查具有contentView
属性的UITableViewCell。
编辑: 仅供参考,请在UITableViewCell中查看以下注释。
// If you want to customize cells by simply adding additional views, you should add them to the content view so they will be positioned appropriately as the cell transitions into and out of editing mode.
@property (nonatomic, readonly, retain) UIView *contentView;
答案 1 :(得分:1)
我在Xcode 4.5中看到了这个错误。 IB将自动布局约束与单元格连接,而不是与单元格的contentView相关联。在Xcode 5中,这个问题已经消失。如果先前在Xcode 4.5中创建了约束,则只需要重新连接约束。
答案 2 :(得分:0)
如果您在DeleteUserCell.xib中使用Autolayout
查看您的约束并尝试执行编辑器 - >重置为表视图单元格中的建议约束。
尝试调整单元格的框架以查看单元格在编辑模式下的外观。
如果您未在DeleteUserCell.xib中使用Autolayout
查看您的单元子视图的自动调整遮罩。确保他们在超视图更改时正确调整框架。
答案 3 :(得分:0)
根据代码的结构,您可以采取一些措施来解决问题。从我提供的代码片段中我不清楚如何使用单元格的自定义nib文件。
首先确保自定义单元格中的图像不包含在附件视图中。要了解有关创建自定义表格视图单元格的更多信息,请查看以下link。
其次,请确保自定义tableCell的UIView与编辑模式下的表视图内容大小相同。点击编辑时,您可能需要重新定位图像。您可以通过以下方法检查编辑何时发生:
也就是说,我会尽可能远离重新定位单元格中的项目。如果单元格是使用autoLayout正确创建的,并且它在没有编辑模式的情况下显示得比在编辑模式下自动调整自己。这是一个link来阅读有关自动布局的更多信息。
答案 4 :(得分:0)
解决此问题的另一个有用方法是处理这些事件:
tableView:willBeginEditingRowAtIndexPath
tableView:didEndEditingRowAtIndexPath
并为各个控件设置适当的帧。
希望它有所帮助!
答案 5 :(得分:0)
用户滑动单元格时会调用以下代码
因此,您可以按如下方式配置单元格内容
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.textAlignment = NSTextAlignmentRight;
// set frames for all content you have got for that cell
UITableViewCellEditingStyle *style = UITableViewCellEditingStyleDelete;
return style;
}
答案 6 :(得分:-1)
这可能对实际问题没有帮助,但我发现您的代码存在一些问题。
首先:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int count = [arrData count];
if(self.editing) [arrData count];
return count;
}
总会返回相同的值吗?你可能只有:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [arrData count];
}
其次你有:
DeleteUserCell *cell = (BlockedUserCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
您正在创建一个DeleteUserCell对象,然后将其转换为BlackedUserCell对象?
至于您的实际问题,进入编辑模式时,您需要手动移动子视图以进行补偿。或者你可以使用自动布局,这应该为你做这个,但它是一个更多的工作。这里和网络上有很多自动布局教程。以下是一些可以帮助您入门的内容:
http://commandshift.co.uk/blog/page/2/
这有一系列指南,包括你正在使用的XIB。