在iPhone应用程序中使用UIActionSheet时,将操作与按钮匹配的典型方法看起来非常脆弱并且美观令人不愉快。也许是由于我最小的C/C++背景(更多Perl,Java,Lisp等)。在按钮索引上进行匹配看起来像是太多的幻数,并且太不连贯以至于避免简单的逻辑或一致性错误。将UIActionSheet选项连接到操作的正确方法
例如,
UIActionSheet *sources = [[UIActionSheet alloc]
initWithTitle:@"Social Networks"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Twitter", @"Facebook", @"Myspace", @"LinkedIn", @"BlahBlah", nil
];
<snip>
-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == [actionSheet cancelButtonIndex]) {
// all done
} else if (buttonIndex == 0) {
// Twitter
} else if (buttonIndex == 1) {
// Facebook
} else if (buttonIndex == 2) {
// LinkedIn
} else if (buttonIndex == 3) {
// Myspace
}
}
公告有在动作处理代码至少两个错误(至少根据的评论)。
我所缺少的是避免在Objective-C中断开连接的正确设计模式。如果这是perl,我会首先构建一个我的按钮选项数组,然后可能创建一个快速查找表散列,它将对应于另一个对象或子例程的查找表,为每个项目做适当的事情。在java中,原始列表可能是带回调的第一个对象。我知道我可以建立一个字典来模仿perl hash,但是这对于3-4个选项来说感觉非常笨拙和麻烦。我也考虑过使用枚举来掩盖索引的魔力,但这只是问题的一小部分。
真正的问题似乎是没有(简单的?)的方式来指定一个位置的按钮字符串和相应的动作列表,从而消除了在添加/删除/重新排序选项时需要在两个地方修改代码和从而使得我的示例代码所犯的错误实际上不可能发生。我不想开始一个编程语言圣战,我只是想在这种情况下(和我相信在目标C中的许多其他人)将正确的设计模式连接到列表中的按钮字符串列表的行动。
你是天才。我不这样想。 – AechoLiu 2010-10-20 09:08:23
这几乎可以确保您无法将应用的用户界面翻译成其他语言。 – stevex 2011-12-05 15:06:50
这是整个话题中最糟糕的方式。您将无法本地化您的按钮,并会在'performSelector'上产生警告。 'performSelector'应该总是和静态选择器一起使用(非动态)。但是,你的问题是一个很好的问题。 – Martin 2015-09-02 14:02:34