3

我是一个新手 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 传递什么?哪个是对的?

4

5 回答 5

2

从概念上讲,没有一个是正确的,在实践中,两者都很好。

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

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

    // etc.
}

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

[self changeMapType:mapTypeControl];
于 2013-03-08T08:44:10.640 回答
0

由于您并没有真正使用“ sender”(被传递到您的 IBAction 方法)做任何事情,因此您几乎可以传递任何您想要的东西。

使用 " self" 或 " nil" 应该没问题。

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

ps这里就像一个回答派对!

于 2013-03-08T08:42:36.283 回答
0

两者都可以,因为您甚至没有在您的方法中使用 sender ......它通常在那里,以防方法需要知道什么对象使用了该函数,这样您就可以去if([sender isKindOfClass:[SomeObject class]])

于 2013-03-08T08:43:36.407 回答
0

对于IBAction,发送者是发送消息调用的接口对象。在您的实例中,以编程方式触发它,没有这样的对象,因此您应该通过nil.

于 2013-03-08T08:43:59.870 回答
0

我同意其他答案——因为你不使用sender,你可以通过任何你想要的。

实际上,我建议您将方法更改为根本不带sender参数。

- (IBAction)changeMapType

控制动作可以有 3 个可能的签名:

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

最好仅在使用附加参数时才采用它们。

一旦你摆脱了那个参数,你就不必担心要传递什么。这个解决方案实际上是正确的——你没有传递一些不是真正的发件人的东西。

如果你传入一些随机的东西,比如nil,你可能有一天决定使用该sender参数,而忘记了你在一个地方传入了垃圾,从而导致问题。但是,如果您完全删除了参数,那么当您需要使用该sender参数时,您将需要更改方法名称,这涉及更改所有调用它的地方(否则它将无法编译,因为方法名称已更改)。所以你不能不小心搞砸了。

于 2013-03-09T02:39:23.380 回答