创建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
的委托方法将表单提供给委托,但是你不能在表单本身中存储任何上下文信息(甚至不是字典)。
答案 0 :(得分:1)
你应该使用objc_setAssociatedObject() 有些代码,请查看http://darkdust.net/writings/objective-c/attaching-objects。
答案 1 :(得分:1)
现在有很多类别可以向UIActionSheet和UIAlertView添加基于块的解散处理程序。我个人使用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
定义为实现委托协议的类。
这种方法的另一个好处是,您可以将视图控制器中的代码分成不同的类,这是一件好事。此外,您的MyDeletionAction
,MyInsertionAction
等可能会共享一些常用代码。
甚至行动表的存在也许应该是您行动的实施细节。例如,如果您在没有确认的情况下提供删除选项,该怎么办?
另请注意,在这种方法中,某人应该保留一个操作对象,例如通过对象保留自己直到操作完全完成,或者为此目的使用VC实例变量:
self.lastAction = [MyDeletionAction actionWithIndex:[indexPath section]];
[self.lastAction start];
这也允许您记住可能的后处理的最后一个动作的状态。
出现 start
因为我的行为通常具有这种继承:MyDeletionAction <- MyAction <- NSOperation
。您的里程可能会有所不同。