今天在写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; 编译器就不会警告,同时也不会产生任何默认代码。