我可以使用静态IBAction方法进行事件连接吗?

时间:2011-01-21 01:58:35

标签: iphone objective-c cocoa

我有一个我正在开发的多视图iPhone应用程序,它将在不同的屏幕上有很多输入,而不是必须用一些只发送resignFirstResponder消息的方法重复我自己,我想我会做一个静态的我的根控制器类中的方法,并用单个函数解决我所有的resignFirstReponder需求。那可能吗?我似乎无法将根控制器.h文件拖到Interface构建器中,如果我尝试将该类放在那里,我就无法将任何事件挂钩到它。有没有办法将事件挂钩到静态的IBAction方法?

修改

我应该更加清楚我要完成的事情。基本上,我在文本字段的“Do End On Exit”事件中调用resignFirstResponder来摆脱键盘。 (这是否是正确的方法?我是一个iPhone新手)因为我将在不同的视图上使用它,我不想为每个视图编写相同的功能。我希望在我的根控制器中有一个+(void) resignSomeKeyboardsOrSomething类型的函数,我可以将每个视图中的“Do End On Exit”事件挂钩。有没有办法做到这一点?对于第一次模糊不清抱歉。

2 个答案:

答案 0 :(得分:1)

让我看看我是否明白这一点,你有一个应用程序有多个屏幕,可以做各种各样的事情,你想要这些东西触发一个功能,对吗?

听起来,通知对您来说效果很好。

因此,假设您在根视图控制器中定义了一个函数resignMyResponder。只需在初始化函数中将以下内容添加到根视图控制器文件中:

[[NSNotificationCenter defaultCenter] 
 addObserver:self 
 selector:@selector(resignMyResponder:) 
 name:@"resignThis" 
 object:nil];

然后,在你的其他屏幕/文件中,每当你想要调用resignMyResponder时,只需执行:

[[NSNotificationCenter defaultCenter] 
 postNotificationName:@"resignThis" object:nil];

resignMyResponder可能需要非常复杂才能处理可能被调用的所有不同情况,但这取决于应用程序的实现。

答案 1 :(得分:0)

遗憾的是,

UIResponder并不像NSResponder那样明确。

  

<强> resignFirstResponder

     

通知   它被要求的接收器   放弃其第一个地位   响应者在它的窗口。

     

- (BOOL)resignFirstResponder

     

<强>讨论

     

默认实现   返回YES,辞职第一响应者   状态。子类可以覆盖它   更新状态或执行某些操作的方法   行动,如不突出   选择,或返回NO,拒绝   放弃第一响应者的地位。

如果我们将一个类的实例方法分为两类(对不起,已经很晚了,也许这样过于简单化了......):

1)旨在直接从其他对象调用以检索某些数据或执行操作的方法。 [view setNeedsDisplay:YES];

2)旨在被(具体)子类覆盖的方法。你通常不会在代码中自己调用这些方法;相反,它们是由Cocoa代表您调用的,意图是覆盖它们以执行自定义实现。 Cocoa为你打电话- (void)drawRect:(NSRect)frame;。在UIResponderNSResponder等抽象类中尤其如此。

- (BOOL)resignFirstResponder属于后者:这种方法基本上是Cocoa,问你“你想辞职第一响应者吗?”。你回答是或否。它会根据需要自动调用。您无需直接调用它。

NSResponder文档更加清晰:

  

<强> resignFirstResponder

     

通知   接收器,它被要求   放弃其第一个地位   响应者在它的窗口。

     

- (BOOL)resignFirstResponder

     

<强>讨论

     

默认实现   返回YES,辞职第一响应者   状态。子类可以覆盖它   更新状态或执行某些操作的方法   行动,如不突出   选择,或返回NO,拒绝   放弃第一响应者的地位。

     

使用NSWindow makeFirstResponder:   方法,而不是这种方法,来制作一个   反对第一响应者。决不   直接调用此方法。

不确定是否有相当于makeFirstResponder:的iPhone,但这就是您应该努力的目标(您积极使新视图成为第一响应者)。