如何以编程方式判断是否已通过代码或用户操作调用IBAction

时间:2011-08-23 01:35:05

标签: iphone objective-c ios uisegmentedcontrol ibaction

如何以编程方式告知代码或用户操作是否调用了IBAction。

例如 我有一个方法,-(IBAction)someMethodWithIts:(id)sender 我已经链接到UISegmentedControl上的valueChanged。

可以通过

来调用
  1. 用户更改细分
  2. 在代码中设置selectedIndex
  3. 致电[self someMethodWithIts:foo];
  4. 有没有办法区分呼叫是否来自第一种方式?

    干杯

    萨姆

3 个答案:

答案 0 :(得分:3)

如果您可以传递nil作为发件人(这是传统的)并使用它来表明它是以编程方式发送的,那就没问题。但是我认为其他任何东西都太脆弱了你应该像这样分解代码:

- (void)someMethod {
  // stuff shared by everyone
}

- (IBAction)someMethodWithIts:(id)sender {
  // stuff specific to IBAction
  [self someMethod];
}

如果您真的想要发件人,那么您可以这样做:

- (void)someMethodWithIts:(id)sender triggeredByUser:(BOOL)isUser {
}

- (IBAction)someMethodWithIts:(id)sender {
  [self someMethodWithIts:sender triggeredByUser:YES];
}

但总的来说,如果你希望IBAction与程序化的变化不同,那么就不要对IBAction进行程序化改变。

答案 1 :(得分:0)

if ([sender isKindOfClass:[UIControl class]]) {
    UIControl *controlSender = (UIControl *)sender;
    if (sender.selected) {
        // then it's #1
    } else {
        // then it's #2
    }
} else if ([sender isKindOfClass:[Foo class]]) {
    // then it's #3
}

可能会工作。或者围绕在UIControl或UISegmentedControl上定义的发件人的其他属性。也许是state。我的猜测是,当用户进行交互时,你可以找到不同的东西,而不是用户。

答案 2 :(得分:0)

你真的想要使用这样的方法

-(IBAction)actionWithSender:(id)sender event:(UIEvent*)event
{
    if (event) {

    } else {

    }
}

如果您发现event参数为nil,则表示来自您的代码中的来电,否则,该来自用户事件。