【问题标题】:How to send parameters to a selector?如何将参数发送到选择器?
【发布时间】:2011-09-24 23:17:34
【问题描述】:

我知道要向选择器发送参数,我们使用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

现在我需要向这个选择器发送一个参数吗?怎么做?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    “向这个选择器发送参数”是什么意思?这句话不计算。

    我觉得你应该稍微 RTFM,例如 iOS 的事件处理指南。

    简而言之,按钮的“动作”是按钮发送给其目标的消息。在 Objective-C 中,消息是由它的选择器定义的,它或多或少可以看作是方法名和签名。

    按钮知道此选择器的三个签名:零、一个或两个参数。在您的情况下,您使用带有一个参数的方法。你无法决定它会是什么。这个论点总是一样的。它将成为发送者,即按钮本身。

    这就是您的操作方法的问题 #1。

    您的操作方法的问题 #2 是您将其定义为类方法。它应该是一个实例方法。

    现在最后,如果你想从 NavigatonUtil 到达 UINavigationController,你需要找到另一种方法。例如预先将其存储为实例变量。

    【讨论】:

    • 似乎NavigationUtil 的实例跨越了它调用的方法,所以我在 ViewController 中将它声明为实例变量并且它运行良好。谢谢。
    【解决方案2】:

    当提供选择器作为操作时,您通常依赖成员 (iVar) 变量。

    在您的情况下,将导航控制器存储为 iVar,然后从您的选择器操作中引用它。

    此外,您将其设置为代码,但如果您想将该方法绑定为接口构建器中的操作,则应使其返回编译器解析为 void 的 IBAction,但这是对接口构建器的提示.请注意,它也不应该是类方法。

    - (IBAction) back
    {
        [[self _navigationController] popViewControllerAnimated:YES];
    }
    

    您可以研究的另一个选项是允许发送带有参数的方法或内联提供代码块的块,这在您想要避免成员状态(例如异步/并发代码)时也有帮助。

    查看这篇 SO 文章:

    UIButton block equivalent to addTarget:action:forControlEvents: method?

    希望有帮助

    【讨论】:

    • 感谢您的回答,但我想我还是 iphone 的新手,了解 iVar 和 C-Blocks..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多