UISegmentedControl在以编程方式更改selectedSegmentIndex时调用动作方法

3

我在xib文件中有一个UISegmentedControl。它与xib文件中的value changed事件上的action方法相关联。

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

mysegmentedcontrol.selectedSegmentIndex = index

我原本期望当用户通过触摸控件来更改时,才会调用操作方法。

这仅适用于UISegmentedControl。


它曾经在iPad上的iOS 4.3.3中发生过,但在iOS 5中不再是问题。 - AmaltasCoder
4个回答

6

.h 文件

BOOL isProgramaticallyChanged;

.m file

- (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;

}

这并不能解决问题,因为value changed仅在实际更改值的情况下被触发。如果我赋相同的索引,它将不会被触发,但isProgChanged变量将是YES。当用户修改控件时,他仍将保留此变量设置为YES。我们可以在将变量设置为YES之前检查是否确实更改了值,但这非常容易出错,对于有许多分段控件的应用程序来说也不可伸缩。 - AmaltasCoder
我使用了上述方法使其工作...但我仍然希望有一个更少出错的解决方案。 - AmaltasCoder

3
解决方案可能是将一个 IBAction 方法链接到 touchUpInside 事件,并在那里传播值的改变,如果您计划通过编程方式更改所选索引。从我们可以阅读的内容来看,即使在Cocoa Fundamentals Guide中,来自UI控件的事件也应该仅在响应用户对控件的操作触发事件时发送,而不是来自编程性的更改。这可能是我的误解,或者是某种UISegmentedControl错误。更详细的解决方案是将一个IBAction方法连接到UISegmentedControlTouch Up Inside事件,并将sender参数转发到处理Value Changed的操作方法。这样,如果有一个程序化的值的改变,控件就不会调用值的改变处理器。只有当它是由于控件上的立即用户操作时才会调用。唯一需要解决的问题是检测所选索引是否实际上已更改。

你能否检查一下这个问题是否也发生在你的设备上,而不仅仅是我遇到的奇怪情况。我正在使用iOS 4.3.3版本的iPad进行测试。 - AmaltasCoder
我记得几个月前我遇到过这样的问题。实际上,我上面提到的解决方法就是我当时使用的方法。我会在今天空闲时间尝试一下。 - macbirdie

2
我将在答案中添加更多内容,这些内容可能会感觉更易控制。 只需调用removeTarget,对所选段进行编程更新,然后重新添加目标(对于UIControlEventValueChanged)。
我来到这里寻找答案,提供的答案似乎有效,但是我认为执行remove/add target更加合适并且有效。

0

不再发生。

当分段控件通过用户事件进行更改时,将调用UIControlEventValueChanged操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接