我知道要向选择器发送参数,我们使用withObject
,但是如何处理以下情况:
UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:[[NavigatorUtil new] autorelease] action:@selector(back:) ];
后退方法如下:
#import "NavigationUtil.h"
@implementation NavigationUtil
+(void) back: (UINavigationController*) navigationController
{
[navigationController popViewControllerAnimated:YES];
}
@end
现在我需要向此选择器发送参数?怎么样?
答案 0 :(得分:0)
你的意思是“向这个选择器发送一个参数”?这个短语不计算。
对我来说,你应该稍微使用RTFM,例如iOS的事件处理指南。
简而言之,按钮的“动作”是按钮发送给目标的消息。在Objective-C中,消息由其选择器定义,可以或多或少地将其视为方法名称和签名。
按钮知道此选择器的三个签名:零,一个或两个参数。在您的情况下,您使用具有一个参数的方法。你无法决定它会是什么。这个论点总是一样的。它将是发送者,即按钮本身。
这就是你的行动方法问题#1。
问题#2与您的操作方法是您将其定义为类方法。它应该是一个实例方法。
现在最后,如果你想从NavigatonUtil到达UINavigationController,你需要找到另一种方法。例如,预先将其存储为实例变量。
答案 1 :(得分:0)
当提供选择器作为操作时,通常依赖于成员(iVar)变量。
在您的情况下,将导航控制器存储为iVar,然后从选择器操作中引用它。
此外,您将其设置为代码,但是如果您希望将该方法绑定为接口构建器中的操作,则应该使其返回编译器解析为无效的IBAction,但这是对接口构建器的提示。请注意,它也不应该是类方法。
- (IBAction) back
{
[[self _navigationController] popViewControllerAnimated:YES];
}
您可以研究的另一个选项是允许发送带参数的方法或内联提供代码块的块,当您想要避免成员状态时(例如异步/并发代码),这也会有所帮助。
查看此SO文章:
UIButton block equivalent to addTarget:action:forControlEvents: method?
希望有所帮助