UISegmentedControl以编程方式调用selectedSegmentIndex时调用action方法

时间:2011-09-21 09:46:57

标签: objective-c ios cocoa-touch uisegmentedcontrol

我的xib文件中有一个UISegmentedControl。它链接到xib文件中值更改事件的操作方法。

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

mysegmentedcontrol.selectedSegmentIndex = index

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

这仅适用于UISegmentedControl。

4 个答案:

答案 0 :(得分:6)

.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
}
<。>文件中的

无论您将此代码以编程方式进行更改,只需在此之前执行此操作

if (mysegmentedcontrol.selectedSegmentIndex != index) {

    isProgramaticallyChanged = YES;

    mysegmentedcontrol.selectedSegmentIndex = index;

}

答案 1 :(得分:3)

解决方案可能是将IBAction方法与touchUpInside事件相关联,如果您还打算以编程方式更改所选索引,则将值更改传播到那里。

即使在Cocoa Fundamentals Guide中我们可以阅读的内容,来自UI控件的事件应仅在触发事件以响应用户对控件执行操作时发送,而不是来自程序更改。这可能是我的误解,也可能是某种UISegmentedControl错误。

我的解决方案更详细

IBAction方法与UISegmentedControl的{​​{1}}事件相关联,并将Touch Up Inside参数转发给处理sender的操作方法。这样,如果值的程序化更改,控件将不会调用值更改处理程序。只有当用户对控件进行即时操作时才会这样做。

这里要解决的唯一问题是检测所选索引是否实际发生了变化。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

不再发生。

  

当细分通过用户事件更改时,将调用UIControlEventValueChanged操作。