自定义编辑AccessoryView 不起作用

发布于 2024-12-02 14:03:40 字数 1990 浏览 0 评论 0原文

我有以下带有自定义单元格的 UITableView 代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FolderCellViewController"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"FolderCellViewController" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
        cell.editingAccessoryView=accessoryView; //accessoryView is a UIView within a UITableViewCell, and it is properly connected in IB
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
    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 NO; //YES here makes a red delete button appear when I swipe
}


// 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
        // [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    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
    }   
}

但是对于某些情况,当我滑动时什么也没有发生。除了这个我什么都没做——我还需要做其他什么才能让它发挥作用吗?

编辑:显然,我所做的只是设置整个表格处于编辑模式时的编辑样式,而不是当我在每个单独的单元格上滑动时的编辑样式。所以我想做的是,当我在每个单元格上滑动时,会出现该单元格的自定义配件视图。但我不知道该怎么做..

I have the following code for a UITableView with custom cell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FolderCellViewController"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"FolderCellViewController" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
        cell.editingAccessoryView=accessoryView; //accessoryView is a UIView within a UITableViewCell, and it is properly connected in IB
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
    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 NO; //YES here makes a red delete button appear when I swipe
}


// 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
        // [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    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
    }   
}

But for some when I swipe nothing happens. I haven't done anything but this-is there anything else I need to do for this to work?

EDIT: Apparently what I did only sets the editing style for when the entire table is in edit mode, not when I swipe on each individual cell. So what I want to do is when I swipe on each cell, the custom accessoryView appears for that cell. But I'm not sure how to do that..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

与君绝 2024-12-09 14:03:40

当单元格进入编辑模式时,将显示编辑附件视图。要真正实现这个工作似乎有点太难了,但我已经做到了:

为了让这个在进入整个表的编辑模式时以及在滑动单个行时都显示,我在我的 UITableViewController 中实现了以下内容子类:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    if (editing)
        self.editingFromEditButton = YES;
    [super setEditing:(BOOL)editing animated:(BOOL)animated];
    self.editingFromEditButton = NO;
    // Other code you may want at this point...
}

editingFromEditButton 是子类的 BOOL 属性。当按下标准“编辑”按钮时将调用此方法。它在以下方法中使用,可防止显示标准删除按钮:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.editingFromEditButton)
        return UITableViewCellEditingStyleNone;

    // Otherwise, we are at swipe to delete
    [[tableView cellForRowAtIndexPath:indexPath] setEditing:YES animated:YES];
    return UITableViewCellEditingStyleNone;
} 

如果将整个表视图设置为编辑模式,则每个单元格也将收到 setEditing 消息。如果我们滑动了单行,那么我们需要强制该单元格进入编辑模式,然后返回 UITableViewCellEditingStyleNone 样式以防止出现标准删除按钮。

然后,要关闭自定义编辑附件,您还需要以下代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // Cancel the delete button if we are in swipe to edit mode
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.editing && !self.editing)
    {
        [cell setEditing:NO animated:YES];
        return;
    }

    // Your standard code for when the row really is selected...
}

The editing accessory view is shown when the cell enters editing mode. It does seem a little bit too hard to actually get this working, but I have managed it:

To get this to show both when entering edit mode for the whole table, and when swiping an individual row, I have implemented the following in my UITableViewController subclass:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    if (editing)
        self.editingFromEditButton = YES;
    [super setEditing:(BOOL)editing animated:(BOOL)animated];
    self.editingFromEditButton = NO;
    // Other code you may want at this point...
}

editingFromEditButton is a BOOL property of the subclass. This method is called when the standard "Edit" button is pressed. It is used in the following method which prevents the standard delete button showing:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.editingFromEditButton)
        return UITableViewCellEditingStyleNone;

    // Otherwise, we are at swipe to delete
    [[tableView cellForRowAtIndexPath:indexPath] setEditing:YES animated:YES];
    return UITableViewCellEditingStyleNone;
} 

If the whole table view is being set to editing mode then each cell will also be sent the setEditing message. If we have swiped a single row, then we need to force that cell into editing mode, and then return the UITableViewCellEditingStyleNone style to prevent the standard delete button from appearing.

Then, to dismiss the custom editing accessory, you also need the following code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // Cancel the delete button if we are in swipe to edit mode
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.editing && !self.editing)
    {
        [cell setEditing:NO animated:YES];
        return;
    }

    // Your standard code for when the row really is selected...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文