将 UIActionSheet 选项连接到操作的正确方法

2024-01-04

在 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(使用前将#替换为@)

将 UIActionSheet 选项连接到操作的正确方法 的相关文章

随机推荐

  • 易失性是否足以更改对列表的引用?

    假设我们有一个列表引用 volatile List a 现在线程 1 初始化它 List newA new LinkedList lt gt newA add new String a Write to a volatile a newA
  • 使用 cookie 的 ASP.NET Web api“记住我”功能

    我正在尝试实施一个 记住账号 我的功能Web Api项目 我想 有记住账号当用户使用时的功能Sign In save a cookies用于保持用户始终登录 以便用户无需键入username and password他们每次访问网站时 通过
  • 私有属性的命名约定

    我见过下划线用作私有属性的前缀 private var aPrivateVar String I am private 我见过它们没有被使用过 private var aPrivateVar String I am private 从语法上
  • 如何使用C-API在Lua 5.1中创建表中表?

    我需要在 Lua 中创建这样的结构5 1C API 不在 Lua 5 2 及以上版本中 a b c d e GOOD print a b c d e 预期结果 良好 感谢您的解答 Lua C API 是基于堆栈的 这意味着大多数 C API
  • 如何以编程方式创建全屏TableLayout(表格高度意外折叠)

    下列TableLayout完全符合我的要求 它填充其父级并且列均匀拉伸
  • 如何在 github 存储库中执行状态检查

    我有一个 GitHub 存储库 在其中我使用以下新功能保护一个分支受保护的分支 https github com blog 2051 protected branches and required status checks 现在我的问题是
  • Bash 中“${!x}”间接扩展的安全注意事项

    假设我有一个变量 说x 包含未知的任意数据 以下间接扩展是否存在代码注入或其他形式的漏洞利用的风险 ARBITRARY COMMAND x 我知道有些情况下x分配给有用的现实生活场景本身可能会带来风险 需要适当控制或清理 但我在这里假设x已
  • 在 Woocommerce 订单和电子邮件中显示产品变体的自定义字段

    我成功地在 WooCommerce 后端添加了产品变体的自定义字段 并能够显示其值 我也想在订单和电子邮件中包含此值 Display Fields in admin on product edit screen add action woo
  • Flash AS3 中的文本链接

    因此 我自己为一些通过 Dropbox 工作的朋友制作了一个 wiki 式的应用程序 这意味着所有文件都存储在本地并由每个人更新 每个文件都是由 Flash 拉入的 txt 文件 然后使用简单的导航和搜索工具显示 现在我正尝试更进一步并链接
  • 在 Rmarkdown 中的每个部分中创建引用

    我想使用 Rmarkdown 但我读到的是 当使用 pandoc 创建参考书目时 引用位于文档末尾 pandoc citeproc 问题 多个参考书目 nocite citeonly https groups google com foru
  • 在 .NET 中处理和返回值

    考虑以下 TextReader reader new StreamReader file XmlSerializer xmlSerializer new XmlSerializer typeof T return T xmlSerializ
  • 更改自定义属性值

    我有一些代码 其中添加了我想要更改其值的自定义属性 div div 这是我正在尝试的 somebutton click function myCustomElement val SomeNewValue 但一切都没有改变 我怎样才能让它发挥
  • 从 Metafor 中的混合效应多级模型获取 R 平方

    我正在 R 中对森林的特定处理进行荟萃分析 对于这个模型 我需要拟合随机效应来解释研究方法的差异和地点年龄的变化之间的差异 因为这两个都是混杂变量 而且我对调查由它们引起的变化并不明确感兴趣 然而 据我所知 包裹 metfor 当您拥有多级
  • Git - 查找索引中单个文件的 SHA1

    我已将一个文件添加到 索引 git add myfile java 如何找到该文件的 SHA1 这是一个老问题 但有一件事需要澄清 这个问题和下面的答案讨论Git 哈希值一个文件的不完全一样 该文件的 SHA1 正如问题中所问 简而言之 如
  • Flex - 访问另一个 mxml 页面上的静态变量时出现问题

    首先 mxml 包含 Datefield 控件如下
  • Java字符串replaceAll()

    我一直想知道是否例如 JTextPane chatTextArea new JTextPane s replaceAll emoticon public String emoticon chatTextArea insertIcon new
  • Angular:ng-bind-html 过滤掉 ng-click?

    我有一些从 json 文件加载的 html 数据 我通过在我的应用程序中使用 ngSanitize 并使用 ng bind html 显示此 html 数据 现在我想将 json blob 中的任何链接从标准转换为 a href some
  • MySQL 列名称标准/约定 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找包含 MySQL 列名称标准或约定的文档 建议 有人可以建议吗 据我所知 这个领域没有什么 标准 与 Sun 的旧 Java 约定不同
  • 在泛型中接受自身作为类型参数有什么用

    我在一个不相关的问题上看到了一些代码 但这让我很好奇 因为我从未见过 Java 泛型的这种构造 创建一个可以将其本身或其后代作为类型参数的泛型类有什么用处 这是示例 abstract class A
  • 将 UIActionSheet 选项连接到操作的正确方法

    在 iPhone 应用程序中使用 UIActionSheet 时 将操作与按钮匹配的典型方法似乎非常脆弱且美观不愉快 也许是因为我的 C C 背景 更多 Perl Java Lisp 等 按钮索引的匹配看起来像是太多的神奇数字 而且太脱节