【问题标题】:UISegmentedControl BehaviourUISegmentedControl 行为
【发布时间】:2010-10-12 15:30:20
【问题描述】:

关于 iPhone 上的 UISegmentedControl 类的快速问题。

希望有些人可能已经注意到,在默认状态下有 2 个分段,分段控件仍然会切换,即使用户点击当前选中的分段。

我在应用程序中看到 UISegmentedControls 否定该行为并且在用户按下选定段时不切换。即 Apple 的 iTune Store 应用程序。

有没有一种简单的方法可以防止我忽略的这种行为,还是我需要在 valueChanged 中写入一些逻辑?

我一直在尝试禁用当前选中的段并启用未选中的段,但是当我不想这样做时,这似乎会改变控件的外观。

有什么想法吗?

【问题讨论】:

    标签: ios objective-c iphone uikit uisegmentedcontrol


    【解决方案1】:

    查看 UISegmentedControl.h 头文件(一个简单的方法是在 XCode 中双击“UISegmentedControl”并按住 Command)。

    您会在其中看到 _segmentedControlFlags 结构中的许多项目。如果您在 UISegmentedControl 上创建一个类别,则可以操作其中的任何元素 - 包括 dontAlwaysToggleForTwoSegments,您可能从名称中猜到它就是您要查找的内容。

    由于这已记录在 API 标头中(尽管不在实际文档中),因此使用起来应该很安全。

    【讨论】:

    • 谢谢!这正是我一直在寻找的。您知道 Apple 为何不将此作为记录在案的财产的任何原因吗?
    • 不完全确定,有趣的是它在标题中而不是在文档中,因为 Apple 在他们不希望使用时将其他内容留在了其他类的标题中......
    • 这是未记录的 API,它是私有的。它在标头中公开的原因是模拟器使用旧版运行时并要求 ivar 布局保持一致。这就是为什么针对一个模拟器构建编译的应用程序并不总是针对其他模拟器构建正常工作的原因。如果你这样做,如果苹果在未来的操作系统版本中更改类的布局,你可能会突然崩溃。
    【解决方案2】:

    此默认行为已在 3.0 API 中更改。

    【讨论】:

      【解决方案3】:

      在 3.0 中,“_segmentedControlFlags”已更改为“momentary”属性,该属性仍可在 UISegmentedControl.h 中找到头文件。

      【讨论】:

        【解决方案4】:

        通过类别访问 _segmentedControlFlags 被视为使用私有 API,因此违反了 Apple 的许可协议,正如我今天必须了解的那样。到现在为止,我一直认为,类别是一种语言功能,可以修复别人糟糕的类设计......

        【讨论】:

        • 如果它暴露在标题中,它不是私有的。私有 API 的使用包括链接私有框架和转储符号信息以为这些框架创建自己的标头。
        • 昨天收到苹果的邮件,抱怨并要求省略访问_segmentedControlFlags。
        猜你喜欢
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2011-08-02
        • 2016-12-17
        • 1970-01-01
        相关资源
        最近更新 更多