篇幅一禽笑,介紹了為什么可以通過mas_key 定位問題目代。如下:
http://www.reibang.com/p/710f742ca71a
如果一個布局很多的頁面靴迫,突然出現這種問題呢濒蒋?比如下面的盐碱,
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<MASLayoutConstraint:0x1c08a0a80 UILabel:0x112a1c600.left == UIView:0x112a1b830.left + 5>",
"<MASLayoutConstraint:0x1c08a1080 UILabel:0x112a1d1e0.left == UIView:0x112a1b830.left + 5>",
"<MASLayoutConstraint:0x1c08a1140 UILabel:0x112a1d1e0.right == UILabel:0x112a1c600.left - 5>"
)
信息只有UILabel UIView,我們可以通過runtime,獲取到ivar 信息,然后手動給ivar 設置mas_key 值沪伙。
代碼如下:
uint32_t ivarCount;
Ivar *ivars = class_copyIvarList([self class], &ivarCount);
if(ivars)
{
for(uint32_t i=0; i<ivarCount; i++)
{
Ivar ivar = ivars[i];
id pointer = object_getIvar(self, ivar);
if ([pointer isKindOfClass:[UIView class]]) {
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
UIView *v = (UIView *)pointer;
v.mas_key = name;
}
}
free(ivars);
}
通過判斷ivar 是不是UIView 的子類瓮顽,然后設置mas_key 的值為ivar的name.這樣子提示信息就很詳細了。
可以提取一個全局的函數出來
/*
* 設置ivar 的 mas_key 值為 對應的名字比如
@interface PBTTestClass : NSObject
@property (nonatomic, strong) UIButton *payButton;
@end
PBTTestClass *c = [PBTTestClass new];
autoSetClassMas_key(c);
就設置 c.payButton.mas_key = @"_payButton";
*
*/
static void autoSetClassMas_key(NSObject *instance) {
uint32_t ivarCount;
Ivar *ivars = class_copyIvarList(instance.class, &ivarCount);
if(ivars)
{
for(uint32_t i=0; i<ivarCount; i++)
{
Ivar ivar = ivars[i];
id pointer = object_getIvar(instance, ivar);
if ([pointer isKindOfClass:[UIView class]]) {
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
UIView *v = (UIView *)pointer;
v.mas_key = name;
}
}
free(ivars);
}
}