为了自动截屏截图和测试目的,我想列出我项目的所有UIViewController
类。
我不希望获得所有UIKit视图控制器的列表,我只想要在项目中创建的那些。
我想在运行时在Objective-C代码中执行此操作,因为我需要实例化一些列出的类。
例如,在我的单元测试中,我可能想要一个测试断言所有UITableViewCell子类返回的高度与xib中相关项的高度相同,并且该对象不是UIView子类,而是UITableViewCell子类。
另一个用途是在项目文档中添加我所有UIViewController
类的屏幕截图。
请注意,此代码不会发送给客户。它仅用于开发人员计算机上的测试和脚本编写。
我想我可以解析pbxproj中包含的文件,但这感觉不对而且不健壮
我的项目中的一个简单的ls *ViewController.h
也可以,但同样的感觉
还有其他想法吗?
如果我可以在其他类上扩展此方式,例如获取我创建的所有UITableViewCells
或全部UIViews
,则获得奖励。
答案 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_t
和class_rw_t
(类对象的数据成员)的定义来有效地探索子类树。
要过滤您的类,您可能需要查看类名称(前缀)的开头,或者如果已为项目创建了一个类VC,则可能需要查看基类VC类。