iOS从另一个类定义SEL

时间:2014-06-10 18:14:37

标签: ios objective-c selector

我试图让另一个对象调用一个选择器。我试图通过定义selector属性来从另一个类定义这个选择器。它似乎没有像我期望的那样工作。

ComboBox.h

@property (nonatomic) SEL onComboSelect;

ComboBox.m

-(void)doneClicked:(id) sender
{
    [textField resignFirstResponder]; //hides the pickerView
    NSLog(@"DONE CLICKED CALLED");
    [self performSelector:@selector(onComboSelect)];
}

OtherClass.h

@interface OtherClass : BaseViewController
{
    ComboBox *combo;
}

-(void)comboSelector;

OtherClass.m

// in viewDidLoad
combo = [[ComboBox alloc] init];
combo.onComboSelect = @selector(comboSelector);

-(void)comboSelector
{
    NSLog(@"COMBO SELECTOR");
}

我看到" DONE CLICK CALLED"在日志中,但不是" COMBO SELECTOR"。所以我知道正在调用doneClicked,但选择器似乎没有工作。我究竟做错了什么?有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

@selector只是一个方法名称 - 它不包含有关定义它的类的任何上下文。所以这个[self performSelector:@selector(onComboSelect)]只是在self上调用方法。除了选择器之外,还需要引用要调用它的对象。

请注意一些内置类(如UIControl)如何同时使用target对象和action选择器。

答案 1 :(得分:1)

您的代码中存在两个主要问题。

<强> 1

onComboSelectSEL,因此无需再次使用@selector

而不是:

[self performSelector:@selector(onComboSelect)];

使用:

[self performSelector:onComboSelect];

<强> 2

您正在从ComboBox类调用self上的选择器,因此它将调用ComboBox对象上的选择器(如果已定义)而不是在OtherClass对象上

答案 2 :(得分:0)

你的回答很有帮助。这是我做的:

添加到ComboBox.h

@property (nonatomic, weak) UIViewController *parentViewController;

已添加到ComboBox.m

-(void)doneClicked:(id) sender
{
    [textField resignFirstResponder]; //hides the pickerView

    if ([parentViewController respondsToSelector:@selector(comboSelector)])
        [parentViewController performSelector:@selector(comboSelector)];
}

添加到OtherClass.m

combo.parentViewController = self;

@property(nonatomic)SEL onComboSelect&lt; - ComboBox.h中不需要此属性。

答案 3 :(得分:0)

SEL是objc_seletor的一个点,并且在object_seletor运行时可以找到 objc_method,定义

objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}

和IMP是方法的重点,您可以在&#34; runtime.h&#34;中找到它。文件。 如何通过object_seletor找到objc_method?我找不到objc_seletor结构的定义。