【问题标题】:How to Delete Row from Table View from other ViewController如何从其他 ViewController 的表视图中删除行
【发布时间】:2014-05-07 03:05:19
【问题描述】:

所以我有一个 DetailViewController,它从表格视图中显示行/单元格的详细信息。现在我想在这个控制器上添加一个 DELETE 选项。我在上面添加了一个 Bar Button Item(trash)。我怎样才能删除当前行/数据并将其也从 TableViewController 中删除?

表视图控制器

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    WishlistItem *wish = [self.wishlistItem objectAtIndex:indexPath.row];

    DetailViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"dvcID"];
    dvc.wishItemStr = wish.wishlistItem;
    dvc.dateItemStr = wish.targetDate;
    dvc.descItemStr = wish.descWishItem;

    [self.navigationController pushViewController:dvc animated:YES];
}

【问题讨论】:

    标签: ios objective-c ios7 ios7.1


    【解决方案1】:

    当您创建详细视图控制器时,您必须使用与行相关的一些数据对其进行初始化。所以你可以扩展那个初始化方法(或者如果你喜欢添加一个新方法),它需要一个块。 当表格视图控制器创建并加载详细视图控制器时,它会使用一些将删除相关行的块代码对其进行初始化。

    示例:(注意我没有编译这个)。

    Add this to the DetailViewController:
    
        @property (copy, nonatomic) void (^deleteRowBlock)(void);
        - (void) onDeletion:(void (^)(void)) deletionBlock;
    
    The implementation of onDeletion is
    
    - (void) onDeletion:(void (^)(void)) deletionBlock
    {
        self.deleteRowBlock = deletionBlock;
    }
    
    
    When the button is pressed in the DetailViewController call the block like this:
    
        self.deleteRowBlock();
    
    
    Then in didSelectRowAtIndexPath: add this:
    
                [dvc onDeletion:^{
                    code to delete the row and update your data model
                }];
    

    然后,当按下按钮时,“删除行并更新数据模型的代码”将被执行。

    或者,如果您不喜欢块(但您应该学会喜欢它们),可以使用诸如 onDelete:(NSIndexPath*) 行之类的方法定义协议。表格视图是详细视图的委托,并实现了协议方法,您可以在按下按钮时调用该方法。 详细视图需要知道它的行号。或者删除 NSIndexPath 作为 onDelete 的参数,并让 tableView 缓存当前显示的详细视图控制器的行号,当调用 onDelete 时,它​​会删除缓存行号的行。 但最好使用块

    【讨论】:

    • 嗨@Martin,你能帮我吗?我不太明白你在说什么。 :( 对不起。只是一个初学者。
    • 你能从 didSelectRowAtIndexPath 添加你的代码吗:你加载细节视图控制器的地方,我会改变它
    • 嗨@Martin,我已经添加了这个 didSelectRowAtIndexPath,如果您需要有关我的问题的更多信息,请告诉我。谢谢。希望你能帮助我,对这个问题感到沮丧几个小时。 :(
    • 我添加了一个使用块的示例。如果您是初学者,尽管这可能很令人困惑,但您必须阅读有关块的书籍或教程的一章才能理解它(您也可能会在块代码中收到编译错误/警告,解决方案是使用“弱自我”指针,您还需要阅读)。另一种方法是使用委托,但如果您不熟悉创建自己的委托,则必须先学习它们,然后才能理解任何示例解决方案。不管怎样,这都是你最终必须学习的东西。
    • 如果您熟悉另一种编程语言,那么块和委托只是回调。
    【解决方案2】:

    嗯,这是另一种解决方案,

    1) 将 self.wishListItem 传递给 DetailViewController,这里是示例

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        DetailViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"dvcID"];
        ...
        [dvc setWishListItem:self.wishListItem];
        ...
        [self.navigationController pushViewController:dvc animated:YES];
    }
    

    2) 在 TableViewController 中像这样实现 viewWillAppear 方法

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.tableView reloadData];
    }
    

    3) 在 DetailViewController 你有一个删除按钮,对吧?这是您的按钮的操作方法

    - (void)onDelete {
        // your deleting stuff ...
        [self.wishListItem removeObjectAtIndex:self.currentItemIndex];  // this line updates shared data
    }
    

    所以 TableViewController 会在您返回后重新加载它的数据并让单元格保持最新状态(例如,通过触摸返回按钮)

    如果您仍有疑问,请随时发表评论。

    【讨论】:

    • 你能详细说明第 3 点吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多