自我IBAction和发件人

时间:2013-03-08 08:39:07

标签: ios objective-c self ibaction sender

我是一名新手iOS程序员,这是我的问题: 我有mapview和分段控件,还有当发生UIControlEventValueChanged时调用的changeMapType函数,就像这样

// change map type with segmented control
- (IBAction)changeMapType:(id)sender
{
    NSInteger i = [mapTypeControl selectedSegmentIndex];
    if (i == 0){
        [worldView setMapType:MKMapTypeStandard];
    }
    if (i == 1) {
        [worldView setMapType:MKMapTypeSatellite];
    }
    if (i == 2) {
        [worldView setMapType:MKMapTypeHybrid];
    }
}

并在viewDidLoad中我想调用此方法来设置哪个地图类型是第一个。

[mapTypeControl setSelectedSegmentIndex:2];
[self changeMapType:nil];

上面的代码工作正常,但下面的代码工作正常

[mapTypeControl setSelectedSegmentIndex:2];
[self changeMapType:self];

最后,作为SENDER传递什么?哪个是对的?

5 个答案:

答案 0 :(得分:2)

从概念上讲,两者都不正确,在实践中,两者都很好。

sender是(或至少应该是)启动操作的UIControl实例(在您的情况下是分段控件)。事实上,你应该像这样开始你的方法:

- (IBAction)changeMapType:(UISegmentedControl *)sender
{
    NSInteger i = [sender selectedSegmentIndex];

    // etc.
}

手动调用时,应传入分段控件:

[self changeMapType:mapTypeControl];

答案 1 :(得分:0)

由于你并没有真正用“sender”做任何事情(传递给你的IBAction方法),你可以传递你想要的任何东西。

使用“self”或“nil”,您应该没问题。

如果 最终在您的任何IBAction中使用“sender”,那么您需要关心以编程方式发送的内容。单击连接到操作的用户界面中的按钮或某个对象时,将发送对该对象的引用。

P.S。这就像在这里的答案派对!

答案 2 :(得分:0)

要么是好的,因为你甚至不在你的方法中使用发送者......通常情况下,方法需要知道什么对象使用了该函数,所以你可以去if([sender isKindOfClass:[SomeObject class]])

答案 3 :(得分:0)

对于IBAction,发件人是发送邮件调用的接口对象。在您的实例中,以编程方式触发此操作,没有这样的对象,因此您应该传递nil

答案 4 :(得分:0)

我同意其他答案 - 因为你没有使用sender,你可以传递你想要的任何答案。

实际上,我建议您将方法更改为不接受sender参数。

- (IBAction)changeMapType

控制操作可以有3种可能的签名:

- (IBAction)changeMapType
- (IBAction)changeMapType:(id)sender
- (IBAction)changeMapType:(id)sender forEvent:(UIEvent *)event

最好只在使用时才使用其他参数。

一旦你摆脱了这个参数,你就不必担心它会传递什么。而这个解决方案实际上是正确的 - 你没有传递的东西不是真正的发送者。

如果你传递了像nil这样的随机内容,你可能有一天会决定使用sender参数,并忘记你在一个地方传递垃圾,造成问题。但是,如果您完全删除了参数,那么当您需要使用sender参数时,您需要更改方法名称,这涉及更改调用它的所有位置(否则它将无法编译,因为方法名称已更改)。所以你不能不小心搞砸了。