【问题标题】:UIPicker crashes app if i spin one component at the same time as another如果我同时旋转一个组件和另一个组件,UIPicker 会使应用程序崩溃
【发布时间】:2010-01-06 18:27:27
【问题描述】:

我有一个包含三个组件的选择器。

前两个组件依赖于最后一个。

可能是这样的:

  1. | 5 | M(线条代表不同的列) 或者 1" | 5" |英尺

如果我正在移动第二列或第一列,并且在它们停止旋转之前,我将第三列从 FT 移动到 M,反之亦然,然后当它仍在移动时,应用程序会崩溃。

我知道这是因为在 UIPicker 的 pickerView:didSelectRow:inComponent: 委托方法中,我正在根据第三列的最终值(即 M 或 FT)执行计算。

所以,简而言之

即使用户以相反的顺序触摸它们,它也会在第一列之前的第三列上执行pickerView:didSelectRow:inComponent:

有没有办法解决这个问题?

如果一个组件仍在旋转,用户可能无法移动另一个组件?

非常感谢任何帮助

谢谢

汤姆

【问题讨论】:

    标签: iphone uipickerview


    【解决方案1】:

    我认为,当一个组件旋转时,它没有选定的值,因此它永远不会调用pickerView:didSelectRow:inComponent: 一旦它停止旋转它确实会向委托发送消息。第一个停止旋转的组件首先发送,而不是第一个接触的组件。这就是为什么您的第三列在前两列之前调用该方法,即使它是最后被触摸的。

    我怀疑崩溃是由于尝试使用移动组件的 nil 选定行值执行操作而引起的。如果是这样,您可以通过在执行操作之前测试每个组件选择的值不是 nil 来避免崩溃。如果组件仍在旋转,那么您应该跳过操作,直到它们停止。

    我认为不可能冻结组件。

    【讨论】:

    • 似乎确实是这种情况......因此是否可以在一个方法的中途暂停一段设定的时间间隔,然后继续操作?
    • 如果我理解你在做什么,最简单的做法是测试所有列是否都有选择的值,如果有,则只继续计算。由于所有 3 列都调用相同的 didSelectRow: 方法,因此每个列都可以在最后一个停止移动的组件时触发计算。您只需要在代码中进行足够的条件检查。
    • 这是关键...使用断点后我意识到我没有足够的条件处理...感谢您的帮助:)
    【解决方案2】:

    您可以通过在组件顶部放置清晰的 UIView 来“冻结”组件。一旦一个组件开始旋转,您就可以显示清晰的视图以防止用户在其他组件上进行交互。

    这应该会阻止此问题的发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多