【问题标题】:How to create macro to point to an object found through iteration如何创建宏以指向通过迭代找到的对象
【发布时间】:2018-06-10 19:35:22
【问题描述】:

我有一个方法可以找到视图的 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 时处理此迭代,同时仍能被视为对象?但我不知道它是如何工作的。

【问题讨论】:

  • @Willeke 不,这与如何查找视图的父 VC 无关,因为您可以看到我的代码已经这样做了。这是一个关于如何将迭代查找对象的方法转换为宏的问题。我提供的父 VC 代码只是一个示例用例。
  • 一个宏的例子在this answer的末尾。
  • @Willeke 嗯,很有用,谢谢。但是,这不是该问题的重复;这只是那个问题中的一些额外内容; StackOverflow 被设置为格式索引,所以这个问题保持开放将帮助未来的读者找到答案,因为建议的副本实际上并没有在其问题标题中解决这里提出的问题,有人只是碰巧发布了一个在那里的一个答案中作为脚注解决了我的问题。

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


【解决方案1】:

能够让它与以下形式的块一起工作:

((^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;\
})()\
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多