一个@dynaminc 引发的问题

今天在写UIAlertController这个控件的时候,需要实现messge的文本对齐,虽然一看就知道设置一个label的属性问题,但是系统的你没法修改,那就只用找方法了 在网上看了好多都是这样实现的

    UIView*subView1 = alert.view.subviews[0];

    UIView*subView2 = subView1.subviews[0];

    UIView*subView3 = subView2.subviews[0];

    UIView*subView4 = subView3.subviews[0];

    UIView*subView5 = subView4.subviews[0];

    //分别拿到title 和 message 可以分别设置他们的对齐属性

    UILabel*message = subView5.subviews[1];

    message.textAlignment = NSTextAlignmentLeft;

这个方法简单粗暴 

第二个方法就是添加分类  我感觉这个是最好的

@property (nonatomic, strong) UILabel *titleLabel;

@property (nonatomic, strong) UILabel *messageLabel;

- (NSArray*)alertViewArray:(UIView*)root {

    staticNSArray*_subviews =nil;

    _subviews =nil;

    for(UIView*viewinroot.subviews) {

        if(_subviews) {

            break;

        }

        if ([view isKindOfClass:[UILabel class]]) {

            _subviews = root.subviews;

            return_subviews;

        }

        [selfalertViewArray:view];

    }

    return_subviews;

}

- (UILabel*)titleLabel {

    return [self alertViewArray:self.view][0];

}

- (UILabel*)messageLabel {

    return [self alertViewArray:self.view][1];

}

但是写这个方法的时候出现会报错 property ’titleLabel' requires method 'settitleLabel:' to be defined - use @dynamic or provide a method implementation in this category

很显然这是要吗写个set方法  或者是@dynamic这个关键词,通常是用不到的 仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。 不想用他代替 也可以写set方法

例如:@dynamictitleLabel;

另外引用: @dynamic 就是要来告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManageObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和Setter方法。

它与@synthesize的区别在于:使用@synthesize,编译器会确实的产生getter和setter方法,而@dynamic仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。

假设有这么个场景,B类,C类分别继承A类,A类实现某个协议(@protocol),协议中某个属性( somePropety )我不想在A中实现,而在B类,C类中分别实现。如果A中不写任何代码,编译器就会给出警告:

“use @synthesize, @dynamic or provide a method implementation"

这时你给用@dynamic somePropety; 编译器就不会警告,同时也不会产生任何默认代码。

你可能感兴趣的:(一个@dynaminc 引发的问题)