2

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

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

请注意,此代码不会发送给客户。它只会用于在开发人员机器上进行测试和编写脚本。

我想我可以解析 pbxproj 中包含的文件,但这感觉不对且不可靠。
我的项目上的一个简单ls *ViewController.h的项目也可以,但对它有同样的感觉。
还有什么想法吗?

如果我可以在其他类上以这种方式扩展,例如获得所有UITableViewCells我创建的或所有UIViews.

4

2 回答 2

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对象的内容做任何你想做的事情。

于 2013-03-09T13:17:21.837 回答
1

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

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

这篇文章

于 2013-03-06T16:46:04.647 回答