如何创建宏以指向通过迭代找到的对象

时间:2018-06-10 19:35:22

标签: objective-c macros clang objective-c-blocks

我有一个方法可以找到视图的parentVC:

-(UIViewController *)mainViewController {
    UIViewController *viewController = nil;
    for (UIView *next = [self superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            viewController = (UIViewController *)nextResponder;
            break;
        }
    }
    return viewController;
}

我希望将来只能使用parentVC,这是我打算制作的一个宏。

唯一的问题是,我不知道如何将其转换为宏,以便我可以说出像parentVC.view.alpha = 0.5f;

这样的内容

我假设宏会以某种方式利用块,所以它可以处理这个迭代,找到父VC,同时仍然可以被视为一个对象?但我无法弄清楚它是如何起作用的。

1 个答案:

答案 0 :(得分:0)

能够以下列形式使用块:

((^NSObject*(void){/*logic+return here*/})())

最终宏:

#define parentVC (\
(^UIViewController*(void){\
UIViewController *viewController = nil;\
for (UIView *next = [self isKindOfClass:[UIViewController class]]?[((UIViewController *)self).view superview]:[((UIView *)self) superview]; next; next = next.superview) {\
UIResponder *nextResponder = [next nextResponder];\
if ([nextResponder isKindOfClass:[UIViewController class]]) {\
viewController = (UIViewController *)nextResponder;\
break;\
}\
}\
return viewController;\
})()\
)