我试图让另一个对象调用一个选择器。我试图通过定义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,但选择器似乎没有工作。我究竟做错了什么?有更好的方法吗?
答案 0 :(得分:3)
@selector
只是一个方法名称 - 它不包含有关定义它的类的任何上下文。所以这个[self performSelector:@selector(onComboSelect)]
只是在self
上调用方法。除了选择器之外,还需要引用要调用它的对象。
请注意一些内置类(如UIControl
)如何同时使用target
对象和action
选择器。
答案 1 :(得分:1)
您的代码中存在两个主要问题。
<强> 1 强>
onComboSelect
是SEL
,因此无需再次使用@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结构的定义。