0

当创建一个UIActionSheet提示用户从列表中删除一个项目时,我目前必须在我的视图控制器中将已删除的项目(或至少它在列表中的索引)维护为实例变量:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([indexPath row] == 4) {
        // Delete button pressed
        _deletingItemIndex = [indexPath section];
        UIActionSheet actionSheet = ...
    }
}

然后当UIActionSheet关闭时,如果用户决定删除该项目,我必须引用该_deletingItemIndex变量,然后将其设置为-1或其他一些nil值。

想做的是在实际中维护删除项或其索引,UIActionSheet而不需要子类化UIActionSheet.

我觉得奇怪的是,委托方法为委托UIActionSheet提供了工作表,但是您不能在工作表本身中存储任何上下文信息(甚至不是字典)。

4

3 回答 3

1

您应该使用 objc_setAssociatedObject() 查看http://darkdust.net/writings/objective-c/attaching-objects的一些代码。

于 2013-11-06T12:45:23.007 回答
1

现在有很多类别可以将基于块的解除处理程序添加到 UIActionSheet 和 UIAlertView。我个人使用Mugunth Kumar 的 UIKitCategoryAdditions

这将让您执行以下操作...

[UIActionSheet actionSheetWithTitle:@"Hooray" message:@"Blocks Are Awesome!" buttons:@[...] showInView:self onDismiss:^(int buttonIndex) {
    //Now you have access to all your local variables here!
} onCancel:^{
    //And here!
}];
于 2013-11-06T12:51:11.217 回答
0

UIActionSheet是一个系统对象,它应该只关心向用户提供选择并获取按钮索引。

使用视图控制器的实例变量也没有意义,因为这实际上不是视图控制器的状态,而是用户开始删除时开始存在的当前操作。

因此,正确的模式是创建一个新对象,将信息保存在那里,并用作委托

    MyDeletionAction *action = [MyDeletionAction actionWithIndex:[indexPath section]];
    UIActionSheet actionSheet = ...
    actionSheet.delegate = action;
    ...

在其他地方,定义MyDeletionAction为实现委托协议的类。

这种方法的另一个好处是您可以将代码从视图控制器中取出到单独的类中,这是一件好事。此外,您的 等可能MyDeletionActionMyInsertionAction共享一些通用代码。

也许甚至行动表的存在也应该是您行动的实施细节。例如,如果您提供不经确认删除的选项怎么办?

还要注意,在这种方法中,有人应该保留一个动作对象,例如通过对象保留自身直到动作完全完成,或者为此目的使用 VC 实例变量:

   self.lastAction = [MyDeletionAction actionWithIndex:[indexPath section]];
   [self.lastAction start];

这还允许您记住最后操作的状态以进行可能的后处理。

start这里出现是因为我的动作通常有这种继承: MyDeletionAction <- MyAction <- NSOperation. 你的旅费可能会改变。

于 2013-11-06T12:54:37.603 回答