我在xib文件中有一个UISegmentedControl。它与xib文件中的value changed事件上的action方法相关联。
当我以编程方式设置selectedSegmentIndex的值时,action方法会被调用。
mysegmentedcontrol.selectedSegmentIndex = index
我原本期望当用户通过触摸控件来更改时,才会调用操作方法。
这仅适用于UISegmentedControl。
我在xib文件中有一个UISegmentedControl。它与xib文件中的value changed事件上的action方法相关联。
当我以编程方式设置selectedSegmentIndex的值时,action方法会被调用。
mysegmentedcontrol.selectedSegmentIndex = index
我原本期望当用户通过触摸控件来更改时,才会调用操作方法。
这仅适用于UISegmentedControl。
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;
}
IBAction
方法链接到 touchUpInside
事件,并在那里传播值的改变,如果您计划通过编程方式更改所选索引。从我们可以阅读的内容来看,即使在Cocoa Fundamentals Guide中,来自UI控件的事件也应该仅在响应用户对控件的操作触发事件时发送,而不是来自编程性的更改。这可能是我的误解,或者是某种UISegmentedControl
错误。更详细的解决方案是将一个IBAction
方法连接到UISegmentedControl
的Touch Up Inside
事件,并将sender
参数转发到处理Value Changed
的操作方法。这样,如果有一个程序化的值的改变,控件就不会调用值的改变处理器。只有当它是由于控件上的立即用户操作时才会调用。唯一需要解决的问题是检测所选索引是否实际上已更改。不再发生。
当分段控件通过用户事件进行更改时,将调用UIControlEventValueChanged操作。