这就是事情..
每次我看到一个关于网络相关iphone的例子 - ipad dev,我看到每次控制器注册自己的通知时,回调方法就像:
-(void)mymethod:(NSNotification *)notification {
//Bla Bla
}
与按钮动作相同..总是喜欢:
- (void)actionmethod:(id)sender {
//Bla Bla
}
我只是进行了一些测试,无论是否带参数,都会调用该方法。 这真的有必要吗?出于什么原因?
谢谢你!!!
答案 0 :(得分:3)
notificationSelector
选择器,指定接收方发送 notificationObserver 的消息,以通知其通知发布。 notificationSelector 指定的方法必须具有一个且仅有一个参数(NSNotification
的实例)。
[强调我的。]
您必须为选择器提供正确的签名;如果你不这样做,它可能会起作用,但它可能会在你不想要的时候停止工作。
您可能希望获取通知的原因是,您可以使用userInfo
字典的形式传递信息,您可以在使用notificationWithName:object:userInfo:
发布通知时指定该字典。调用方法时可以忽略参数,但参数必须在方法签名中。
对于按钮及其操作,docs表示您可以拥有三个签名中的一个*:
UIKit框架允许三种不同形式的动作选择器:
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event
IBAction
返回类型等同于void
(没有返回值),除了它在头中的方法中的存在允许Interface Builder知道该方法是作为一个动作,以便您可以连接控件。
想要获得按钮(或其他控件)的原因与通知类似。如果您的界面中有许多按钮,其中一些按钮(例如在表格视图中)连接到同一个动作,您可能需要通过按下按钮的标识区分您所做的确切事情。
*:为了完整起见,我想提一下,这是Mac上不的情况;在那里,一个动作方法必须具有以下形式:- (IBAction)action:(id)sender
。
答案 1 :(得分:1)
当我发现我可以在没有任何争论的情况下调用这些方法时,我只做到了这一点。它适用于大多数情况,但在某些情况下它显示NSInvalidArgumentException
。为了安全起见,最好提一下这些论点。
以下是不使用参数导致应用程序崩溃的示例:
答案 2 :(得分:0)
根据苹果文件。 iOS中按钮的接收器可以是 - (void)动作, - (void)动作:(id)发送者。并且通知还可以具有参数NSNotification或无参数。这取决于你的需求。
例如,我需要通过通知传输UIImage,因此我将UIImage添加到NSNotification的userInfo字典中。与发件人一样,如果我需要发件人的某些属性,我将添加(id)发件人作为参数。通常,我喜欢为 - (id)sender或NSNotification添加这些参数。如果我需要来自通知或发件人的某些信息,那么我不需要更改原始方法,因为他们已经有发送者或通知对象来获取我需要的信息。
<强>更新强> 必须添加NSNotification参数。 The reference document link