代码之家  ›  专栏  ›  技术社区  ›  Jameson

obj-c中带参数的选择器

  •  1
  • Jameson  · 技术社区  · 15 年前

    所以基本上我有一个大的按钮列表,显示下拉列表和其他东西,这些按钮是动态创建的。因此,为了捕获适当按钮数据的值,我需要将它的操作选择器设置为一个额外带1个参数的函数。

    例如,在此下拉列表中使用此选择器,并使用下面的方法,将返回一个无法识别该选择器的错误。如何让选择器识别我传入的参数?(在本例中,变量'name')

    苹果公司文件地址: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocSelectors.html#//apple_ref/doc/uid/TP30001163-CH23-SW1

    在标题“目标动作设计模式”的最后一段,苹果文档 意味着 这可以做到,但不要举一个使用自定义消息的例子,或者我只是误解了?

    SEL sel = @selector(openDropdown:name:);
    [dropdownSelector addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];
    
    
    -(void) openDropdown: (NSString *) anotherArg : (id) sender {
     // Stuff here based on anotherArg
    }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   Mihir Mathuria    15 年前

    您应该能够从 id 输入ARG

        UIButton *button = (UIButton *) sender
         NSString *title = [button currentTitle];
    

    不需要传递额外的参数

        2
  •  2
  •   Ole Begemann    15 年前

    你的要求无法实现。来自文档:

    uikit允许三种不同形式的操作选择器:

    - (void)action
    - (void)action:(id)sender
    - (void)action:(id)sender forEvent:(UIEvent *)event

    由于您对事件参数没有影响,因此 sender 对象必须包含要传递给操作方法的所有信息。

    尽管您在对mihirsm的答案的评论中写了什么,但您确实可以将uibutton子类化,以向每个button实例添加您想要的所有附加信息。你也可以用按钮 tag 属性来标识它(为每个按钮分配一个唯一的标记),并使用标记作为键将所有附加信息存储在数组或字典中。

    更新: 将来,您还可以使用 associative storage 在不进行子类化的情况下向对象添加数据,但这项技术在iPhone平台上尚不可用(目前只有10.6)。

        3
  •  1
  •   rpetrich    15 年前

    CALayer s支持任意键进行键值编码;您可以使用它附加任意层:

    [[button1 layer] setValue:@"firstButtonData" forKey:@"myKey"];
    [[button2 layer] setValue:@"secondButtonData" forKey:@"myKey"];
    

    后来:

    - (void)action:(id)sender forEvent:(UIEvent *)event
    {
        NSLog(@"Data for the button that was pressed: %@", [[sender layer] valueForKey:@"myKey"]);
    }
    

    注意不要与上的任何现有属性冲突 卡莱尔