这是可能的,我在网上搜索并没有找到答案。我的大四学生也说过这是不可能的。
我试图将其添加为一个类别,所以我想从中提取4种类型的对象,它们都使用相同的代码,它只是不同的类,所以我想这个:
- (NSDictionary *) getObjectsOfClass:(Class)class
{
NSMutableDictionary *objDict = [NSMutableDictionary dictionary];
[self.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:class]) {
/*
Is there a way to do this?
class *label = (class *)obj;
*/
}
}];
return objDict;
}
有没有办法让这项工作?看到4个功能几乎相同的代码很难看,你同意吗?
答案 0 :(得分:4)
如何将类名作为字符串&从中创建对象。可能是这样的
-(NSArray *)arrayOfObjectsForClass:(NSString *)className{
NSMutableArray *objectArray = [[NSMutableArray alloc]init];
CGFloat yAxis = 10;
for(int i =0; i<5; i++){
id object = [[NSClassFromString(className) alloc]initWithFrame:CGRectMake(0, yAxis, 100, 50)];
[object setTitle:[NSString stringWithFormat:@"Button %d", i+1]];
[objectArray addObject:object];
yAxis+= 60;
}
return objectArray;
}
答案 1 :(得分:2)
您可以像这样实例化class
参数:
id newInstance = [class new];
你无法在语法上做的是使用class *
作为告诉编译器本地变量的类型的方法。但是,由于Objective C动态类型化功能,这也不是必需的。
换句话说,没有理由转换为class
(你不能这样做; class
只在运行时知道,转换在编译时有效。)
编辑:
如果您知道所有课程共有的基类,例如UIView
,那么你可以这样做:
UIView* newInstance = obj;
然后访问其属性,例如:
if (newInstance.tag ==…)
或者您可以使用消息发送而不是属性来执行:
if ([obj tag] == ...)
答案 2 :(得分:2)
如果所有这些都是从公共基类派生的,则可以将它们转换为该公共基类。如果没有可用的函数很少,则创建该公共基类的类别,并将这些常用函数添加到其中。这将允许您使用单个代码块而不是4个不同的代码块。
答案 3 :(得分:2)
因为你说“但是我将它添加到uiview,获取文本字段,标签,pickerviews等,以便我可以调用[self.view getObjectsOfClass:[UILabel class]”
对于此代码
[self.view getObjectsOfClass:[UILabel class]];
它会返回它所有的UILabel直接孩子。
- (NSMutableArray *) getObjectsOfClass:(Class)class
{
NSMutableArray *objArray = [NSMutableArray array];
[self.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// All visible things are inherited from UIView. Tag property is belongs to UIView
// UILabel are inherited from UIView
if ([self isKindOfClass:[UIView class]] && [obj isKindOfClass:class]) {
UIView *aView = (UIView*)obj;
if (aView.tag == 100) {
//This is the view with tag 100
}
[objArray addObject:obj];
}
}];
return objArray;
}