在UIActionSheet中存储上下文信息

时间:2013-11-06 12:40:14

标签: ios objective-c cocoa-touch

创建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的委托方法将表单提供给委托,但是你不能在表单本身中存储任何上下文信息(甚至不是字典)。

3 个答案:

答案 0 :(得分:1)

你应该使用objc_setAssociatedObject() 有些代码,请查看http://darkdust.net/writings/objective-c/attaching-objects

答案 1 :(得分:1)

现在有很多类别可以向UIActionSheet和U​​IAlertView添加基于块的解散处理程序。我个人使用Mugunth Kumar's 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!
}];

答案 2 :(得分: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。您的里程可能会有所不同。