gpt4 book ai didi

iphone - UISegmentedControl 更改事件未在 iOS5 中触发

转载 作者:IT王子 更新时间:2023-10-29 07:42:34 25 4
gpt4 key购买 nike

我有一个 UISegmentedControl,它的“Value changed”事件在 Interface Builder 中连接以调用我的 Controller 的 -(IBAction)segmentChangeAction:(id)sender;

当用户点击控件更改所选段时,无论是在 iOS4 还是 iOS5 中,都会按预期调用 segmentChangeAction

当我通过 segmentedControl.selectedSegmentIndex = newIndex; 以编程方式更改所选段时,在 iOS4 上调用 segmentChangeAction 并且该段反射(reflect)了新的选择。然而在 iOS5 上 segmentChangeAction 未被调用,但该段确实反射(reflect)了新的选择。

这是 iOS5 的变化吗?当我以编程方式更改选择时,我可以做些什么来在 iOS5 上调用 segmentChangeAction

最佳答案

这是 iOS 5 中的一项更改,目的是使 UISegmentedControl 与所有其他控件保持一致。

这个想法是,操作应该只在用户交互时自动触发。在 iOS 5 之前,UISegmentedControl 的操作会因用户交互程序交互而被触发。但是,以编程方式启动更改意味着您也可以自己执行 [myControl sendActionsForControlEvents:UIControlEventValueChanged]

然而,你必须小心这一点。假设你这样做:

[segmentedControl setSelectedSegmentIndex:newIndex];
[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];

如果您在 iOS 5 上构建并运行它,它会按您预期的那样工作。如果您在 iOS 4 上构建并运行它,您将触发您的操作两次(一次是在您setSelectedSegmentIndex 时,另一次是在您sendActions...).

解决这个问题的方法是做一些守卫。这可能是一个运行时检查,以表明您正在 iOS 5+ 设备上运行,或者甚至可能是更普通的东西,如下所示:

// changingIndex is a BOOL ivar
changingIndex = YES;
[segmentedControl setSelectedSegmentIndex:newIndex];
changingIndex = NO;
[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];

然后在您的操作方法中...

- (void)segmentedControlSelectedIndexChanged:(id)sender {
if (!changingIndex) {
// your action code here, guaranteed to only run as a result of the sendActions... msg
}
}

关于iphone - UISegmentedControl 更改事件未在 iOS5 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8054728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com