我想在我的单元格上添加一个与刷卡到删除功能相同的自定义按钮。因此,当点击我的自定义按钮时,这个将被隐藏,让我们出现正式的红色“删除”按钮。
所以我做了类似的事情:
/// Controller.m
///
/// @brief Delete icon button pressed. Trigger display of Delete full button
///
- (IBAction)deleteDrug:(id)sender event:(id)event {
NSIndexPath *indexPath = [self indexPathForButton:sender event:event];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setEditing:YES animated:YES];
}
/// CustomCell.m
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
// hide / show "modify" button when entering in edit mode
switch (editing) {
case YES:
self.deleteButton.hidden = YES;
break;
case NO:
self.deleteButton.hidden = NO;
break;
default:
break;
}
}
此时,我的自定义按钮在点击时会隐藏,但官方的红色“删除”按钮没有出现。
有人知道如何处理这个问题吗?
答案 0 :(得分:5)
我相信tableView会更多地处理删除按钮。因此,您可能需要让tableView知道它应该正在编辑,而不是设置您的单元格编辑。
- (IBAction)deleteDrug:(id)sender event:(id)event {
selectedButtonIndex = [self indexPathForButton:sender event:event];
[tableView setEditing:YES animated:YES];
}
所以你可能需要做一些事情,比如设置tableView进行编辑。然后在tableview的数据源中,您可以实现此方法,其中selectedButton是正确单元格的索引路径。
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath == selectedButtonIndex) {
return YES;
}
return NO;
}
您可能需要为数据源实现此方法。
- (UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
}
答案 1 :(得分:1)
我没有找到任何适当的解决方案,所以我自己做了。我制作了假删除按钮,它的工作方式与原始按钮非常相似。我在这里展示了棘手的删除按钮部分。
如果你想知道如何替换默认的减号(删除)编辑控件,有关于它的好文章,我建议:http://vinsol.com/blog/2015/01/06/custom-edit-control-for-uitableviewcell/
因此,假设您从文章中做了第一部分,并且您希望在按下自定义编辑控件按钮时看到删除按钮。代码在Swift上,但您可以使用相同的步骤在Objective-C
中进行此操作func deleteButtonShow(){
let deleteButton = UIButton(frame: CGRect(x: self.frame.width, y: 0, width: 80, height: self.frame.height))
deleteButton.backgroundColor = UIColor.redColor() // ! note: original delete have another color
deleteButton.setTitle("Delete", forState: UIControlState.Normal)
deleteButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
deleteButton.addTarget(self, action: "actionForDelete", forControlEvents: UIControlEvents.TouchUpInside)
// action for your button will call delegate that will do the delete work. in most cases
self.contentView.addSubview(deleteButton)
var movedSubviews = self.subviews
var i = 0
for subview in movedSubviews {
// NOTE: I added tag = 1 in the storyboard to Content View of my cell
if subview.tag == 1 {
movedSubviews.removeAtIndex(i) // we don't need to move it.
break
}
++i
}
movedSubviews.extend(self.contentView.subviews)// add subviews from content view
UIView.animateWithDuration(0.3, animations: { () -> Void in
for movedView in movedSubviews as! [UIView] {
movedView.frame = CGRect(origin: CGPoint(x: movedView.frame.origin.x - 80, y: movedView.frame.origin.y), size: movedView.frame.size)
//animate the things
}
})
}
我们不想移动内容视图,因为我发现如果我们的按钮不在上面的内容视图中它是不可触及的,我有一些想法,但不确定。如果您知道原因,请在评论中添加此信息,我很想知道。
我还想注意,如果你像我一样使用autolayout,你需要更改动画中的约束,而不是它的框架,所以你可能不需要extend
部分。
答案 2 :(得分:-3)
请执行此操作以使用UITableViewcell右侧的删除按钮。
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
withRowAnimation:UITableViewRowAnimationTop];
[self.**yourarray** removeObjectAtIndex:indexPath.row];
[tableView endUpdates];
[tableView reloadData];
}
}