我是一名新手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传递什么?哪个是对的?
答案 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
参数时,您需要更改方法名称,这涉及更改调用它的所有位置(否则它将无法编译,因为方法名称已更改)。所以你不能不小心搞砸了。