我可以为 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,我认为您应该查看此文档以确保您输入的逻辑正确。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html

您可以通过让编译器看到 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: