在 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 中的许多其他模式)将按钮字符串列表连接到操作列表的正确设计模式是什么。
我更喜欢这种方式
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == [actionSheet cancelButtonIndex])
{
// cancelled, nothing happen
return;
}
// obtain a human-readable option string
NSString *option = [actionSheet buttonTitleAtIndex:buttonIndex];
if ([option isEqualToString:@"Twitter"])
{
//...
} else if ([option isEqualToString:@"FaceBook"])
{
//...
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)