项目中刚好用到 objective-c 的一个开源项目 Masonry 示例代码如下
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
用 RubyMotion 和 motion-cocoapods 安装
Motion::Project::App.setup do |app|
app.pods do
pod 'Masonry'
end
end
调用
label.mas_makeConstraints(lambda { |make| # Line 24
make.center.equalTo(superview)
})
一切看上去都很美好,直到现实给了我一耳光
*** Terminating app due to uncaught exception 'ArgumentError', reason: 'guess_view_controller.rb:24:in `block in viewDidLoad': wrong number of arguments (1 for 0) (ArgumentError)
那就检查下到底哪里出了问题
p make.center.method('equalTo').arity # return 0
妹啊,为啥跟文档说的不一样的。。。
看完源码才知道。。。
equalTo
返回的是个 block,而 objective-c 的 block 就是 TM 的直接调用的。。。
- (MASConstraint * (^)(id))equalTo {
return ^id(id attribute) {
return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
};
}
好吧,改过来就好了
label.mas_makeConstraints(lambda { |make| # Line 24
make.center.equalTo.call(superview)
})
本来这只是个小事情,可是难道以后 Objective-C 的库,类似的情况我都要去翻下源码才能确定是不是这个问题嘛。。。 累觉。。还是爱