列出项目的所有UIViewControllers

时间:2013-03-06 16:05:12

标签: objective-c cocoa automation uikit automated-tests

为了自动截屏截图和测试目的,我想列出我项目的所有UIViewController
我不希望获得所有UIKit视图控制器的列表,我只想要在项目中创建的那些。

我想在运行时在Objective-C代码中执行此操作,因为我需要实例化一些列出的类。
例如,在我的单元测试中,我可能想要一个测试断言所有UITableViewCell子类返回的高度与xib中相关项的高度相同,并且该对象不是UIView子类,而是UITableViewCell子类。
另一个用途是在项目文档中添加我所有UIViewController类的屏幕截图。

请注意,此代码不会发送给客户。它仅用于开发人员计算机上的测试和脚本编写。

我想我可以解析pbxproj中包含的文件,但这感觉不对而且不健壮 我的项目中的一个简单的ls *ViewController.h也可以,但同样的感觉 还有其他想法吗?

如果我可以在其他类上扩展此方式,例如获取我创建的所有UITableViewCells或全部UIViews,则获得奖励。

2 个答案:

答案 0 :(得分:3)

使用我的NSObject+Subclasses类别,您可以轻松获取UIViewController的所有子类。

要仅获取您的视图控制器,请按以下方式过滤它们:

NSSet *myViewControllerClasses = [[UIViewController subclasses_xcd] filteredSetUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return [[NSBundle bundleForClass:evaluatedObject] isEqual:[NSBundle mainBundle]];
}]];

然后,您可以使用包含myViewControllerClasses个对象的Class内容执行任何操作。

答案 1 :(得分:1)

使用运行时,有点困难。您可以使用class_tclass_rw_t(类对象的数据成员)的定义来有效地探索子类树。

要过滤您的类,您可能需要查看类名称(前缀)的开头,或者如果已为项目创建了一个类VC,则可能需要查看基类VC类。

this article

相关问题