在 iphone 应用程序中使用 UIActionSheet 时,将动作与按钮匹配的典型方法看起来非常脆弱且不美观。可能是因为我的 C/C++ 背景很少(更多 Perl、Java、Lisp 等)。按钮索引上的匹配看起来像是太多的幻数,而且太不连贯,无法避免简单的逻辑或一致性错误。
例如,
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 哈希,但是对于 3-4 个选项来说,这感觉非常笨拙和麻烦。我还考虑过使用枚举来掩盖索引的魔力,但这只是问题的一小部分。
真正的问题似乎是没有(简单?)方法可以在一个地方同时指定按钮字符串列表和相应的操作,从而在添加/删除/重新排序选项时无需在两个地方修改代码,从而使其有效不可能犯我的示例代码所犯的那种错误。
我并不是要开始一场编程语言的圣战,我只是想弄清楚在这种情况下(我相信 Objective C 中的许多其他人)将按钮字符串列表连接到动作列表的正确设计模式是什么。