【问题标题】:UISegmentedControl calls action method on changing selectedSegmentIndex programmaticallyUISegmentedControl 在以编程方式更改 selectedSegmentIndex 时调用操作方法
【发布时间】:2011-11-21 19:16:24
【问题描述】:

我的 xib 文件中有一个 UISegmentedControl。它与 xib 文件中值更改事件的操作方法相关联。

当我以编程方式设置 selectedSegmentIndex 的值时,将调用操作方法

mysegmentedcontrol.selectedSegmentIndex = index

我希望只有当用户通过触摸更改控件时才会调用操作方法?

这只发生在 UISegmentedControl 上。

【问题讨论】:

  • 它曾经在 iPad 上的 iOS 4.3.3 中发生,在 iOS 5 中不再是问题

标签: objective-c ios cocoa-touch uisegmentedcontrol


【解决方案1】:

不再发生。

UIControlEventValueChanged 操作在通过用户事件更改段时调用。

【讨论】:

    【解决方案2】:

    .h 文件

    BOOL isProgramaticallyChanged;
    

    .m 文件

    - (IBAction)segmentAction:(id)sender { // valuechanged connected function
    
            UISegmentedControl *segControll = (UISegmentedControl *)sender;
    
        if (segControll.tag == 55) { // while create segment specify tag value to 55 (to set use via IB or Code)
    
            if (isProgramaticallyChanged == NO) {
    
                // your valuechanged code here
    
            }
    
            else {
    
                isProgramaticallyChanged = NO; //important
    
            }
    
        }
    
        else if (segControll.tag == 66) { // for many segments
    
        }
    
            //...like this do for all segments
    }
    

    在 .m 文件中

    无论您将此代码放在何处以编程方式进行更改,都可以像这样

    if (mysegmentedcontrol.selectedSegmentIndex != index) {
    
        isProgramaticallyChanged = YES;
    
        mysegmentedcontrol.selectedSegmentIndex = index;
    
    }
    

    【讨论】:

    • 这不会解决问题,因为值更改仅在值实际更改的情况下才会触发。如果我分配相同的索引,它将不会被触发,但 isProgChanged 变量将为 YES。当用户修改控件时,他仍然会将这个变量设置为 YES。我们可以在将变量设置为 YES 之前检查我们是否真的在更改值,但这很容易出错,并且对于具有许多分段控件的应用程序而言不可扩展。
    • 我使用上面的方法让它工作......我仍然更喜欢一个不易出错的解决方案。
    【解决方案3】:

    我将在答案中添加更多内容,这可能会让人感觉更可控。 只需调用 removeTarget,对所选段进行编程更新,重新添加目标(用于 UIControlEventValueChanged)

    我来这里是为了寻找答案,提供的答案似乎有效,但后来我发现做删除/添加目标感觉更合适且有效。

    【讨论】:

      【解决方案4】:

      解决方案可能是将IBAction 方法链接到touchUpInside 事件并在那里传播值更改,如果您还计划以编程方式更改所选索引。

      从我们甚至可以在Cocoa Fundamentals Guide 中读到的内容来看,来自 UI 控件的事件应该仅在响应用户对控件的操作而触发事件时发送,而不是来自编程更改。这要么是我的误解,要么是某种 UISegmentedControl 错误。

      我的解决方案更详细

      IBAction 方法连接到UISegmentedControlTouch Up Inside 事件,并将sender 参数转发给处理Value Changed 的操作方法。这样,如果值发生编程更改,控件将不会调用值更改处理程序。仅当用户立即对控件进行操作时。

      这里唯一要解决的就是检测选中的索引是否真的发生了变化。

      【讨论】:

      • 你能检查一下这是否也发生在你身上,这对我来说并不奇怪。我正在使用 4.3.3 iOS 的 iPad 上进行测试。
      • 我记得几个月前我遇到过这样的问题。实际上,我在上面写的解决方法是我使用的解决方法。我今天有空试试。
      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多