我可以为 class 设置 属性,它在 OC 中直到 运行 才被指定吗?
Can I set the property for a class, which hasn't been specified until run in OC?
我有一个以动态视图作为视图的固定控制器。我想为某个视图的 属性 设置值。
控制器中的代码如下:
@property (nonatomic, retain) Class viewClass;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view = _viewClass.new;
if ([_viewClass resolveInstanceMethod:@selector(lineAdded)]) {
[_viewClass setValue:@YES forKey:@"lineAdded"];
}
self.view.backgroundColor = [UIColor whiteColor];
}
在*特定*视图中,我有一个像这样的属性。
@property (nonatomic, assign) BOOL lineAdded;
让我想起了
Undeclared selector 'lineAdded'
当我运行时,它只是跳过if条件并继续。
我的问题是:不指定所属的class是不是不能设置属性?
希望有人能帮助我。提前致谢。
当您设置 @YES
的值时。您应该将其声明为 NSNumber
而不是使用原始数据类型:BOOL
。检索时,应使用-(BOOL)boolean
方法检索。至于 resolveInstanceMethod
,我认为您应该查看此文档以确保您输入的逻辑正确。
您可以通过让编译器看到 lineAdded
选择器的声明来消除警告。 #import
一个包含 属性 声明的头文件,或者以另一种方式声明它,例如:
@protocol DummyProtocol
@property (nonatomic, unsafe_unretained) BOOL lineAdded;
@end
其次,设置 属性 的值不需要 lineAdded
选择器。它需要 setLineAdded:
选择器。
第三,检查self.view
是否响应setLineAdded:
的正确方法是询问它,像这样:
if ([self.view respondsToSelector:@selector(setLineAdded:)]) {
[self.view setValue:@YES forKey:@"lineAdded"];
}
第四,你问 _viewClass
它的实例是否响应 lineAdded
,但你问的是 _viewClass
对象本身(而不是 self.view
的实例它) 来设置它自己的 lineAdded
属性。我在上面的代码中修复了这个问题。
第五,你应该在loadView
中分配给self.view
,而不是在viewDidLoad
。
如果,毕竟,它没有设置 lineAdded
,那么您的视图(无论您选择什么 class)根本不会响应 setLineAdded:
。
我有一个以动态视图作为视图的固定控制器。我想为某个视图的 属性 设置值。
控制器中的代码如下:
@property (nonatomic, retain) Class viewClass;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view = _viewClass.new;
if ([_viewClass resolveInstanceMethod:@selector(lineAdded)]) {
[_viewClass setValue:@YES forKey:@"lineAdded"];
}
self.view.backgroundColor = [UIColor whiteColor];
}
在*特定*视图中,我有一个像这样的属性。
@property (nonatomic, assign) BOOL lineAdded;
让我想起了
Undeclared selector 'lineAdded'
当我运行时,它只是跳过if条件并继续。
我的问题是:不指定所属的class是不是不能设置属性?
希望有人能帮助我。提前致谢。
当您设置 @YES
的值时。您应该将其声明为 NSNumber
而不是使用原始数据类型:BOOL
。检索时,应使用-(BOOL)boolean
方法检索。至于 resolveInstanceMethod
,我认为您应该查看此文档以确保您输入的逻辑正确。
您可以通过让编译器看到 lineAdded
选择器的声明来消除警告。 #import
一个包含 属性 声明的头文件,或者以另一种方式声明它,例如:
@protocol DummyProtocol
@property (nonatomic, unsafe_unretained) BOOL lineAdded;
@end
其次,设置 属性 的值不需要 lineAdded
选择器。它需要 setLineAdded:
选择器。
第三,检查self.view
是否响应setLineAdded:
的正确方法是询问它,像这样:
if ([self.view respondsToSelector:@selector(setLineAdded:)]) {
[self.view setValue:@YES forKey:@"lineAdded"];
}
第四,你问 _viewClass
它的实例是否响应 lineAdded
,但你问的是 _viewClass
对象本身(而不是 self.view
的实例它) 来设置它自己的 lineAdded
属性。我在上面的代码中修复了这个问题。
第五,你应该在loadView
中分配给self.view
,而不是在viewDidLoad
。
如果,毕竟,它没有设置 lineAdded
,那么您的视图(无论您选择什么 class)根本不会响应 setLineAdded:
。