如何在id类对象上调用方法?

时间:2015-04-04 03:20:30

标签: ios objective-c class

我正在尝试编写代码,以简化内部工具构建中新功能的添加。有一个UITableView,每个单元格都是一个按钮,可以进入另一个视图。

每个函数都在自己的类文件中。目前,这就是我这样做的方式。

在视图控制器中,我在方法中初始化类,然后我进入其视图控制器

- (void)resetButtonTouched {
    [ResetClass *reset = [[ResetClass alloc] initWithNumber num];
    [self.navigationController pushViewController: reset animated: YES];
}

然后对于cellForRowAtIndexPath我创建单元格

cell.textLabel.text = @"Reset";

然后在didSelectRowAtIndexPath中创建按钮响应

[_viewController resetButtonTouched];

我为其他10个函数执行此操作,所以

[Function2 * function2 = [[Function2 alloc] initWithNumber num]; [Function3 * function3 = [[Function2 alloc] initWithNumber num];

等...

我想简化这个,所以我只需要在一个地方注册一个类,它会自动添加单元格并连接按钮。对于cellForRowAtIndexPath和didSelectRowAtIndexPath,我可以让它基于indexPath.row查看数组。但是,我需要一种方法将类对象存储在一个数组中,并在调用时初始化它们。

我想我可以将所有添加到此处的函数都添加到

的类方法中
  • 返回标题(对于cellForRowAtIndexPath中的按钮标题)
  • 类名(对于NSClassFromString,所以我可以确定数组中类对象的类)

和初始化后要调用的常规方法。

如果我只写这两行,我想写点什么,

ResetFunction *reset;
[self registerFunction:reset];

它将完成我上面所做的一切(创建一个调用该类对象的工作按钮)

我正在考虑使用一个数组来存储所有不同的类对象,称之为allFunctions,以及一个方法runFunction,它将执行初始化和segueing。然后在cellForRowAtIndexPath中,它只是

cell.textLabel.text = [allFunctions[indexPath.row] getTitle];

在didSelectRowAtIndexPath中,它将调用[_viewController runFunction:allFunctions[indexPath.row]];

我该怎么做?我尝试使用id *参数创建一个方法,该方法接受类对象,目的是将其存储在数组allFunctions中,我在制作一个存储所有函数的方法时遇到了麻烦,因为当我尝试调用[self registerClass:reset]时,它给了我“用ARC禁止非客观c指针到autoreleasing id的隐式转换”。

我该怎么办?

1 个答案:

答案 0 :(得分:3)

类对象也是对象。而不是id,而是使用Class变量来保存对类对象的引用。

Class theClass = [ResetClass class];

您可以将这些内容存储在NSMutableArray

[someArray addObject:theClass];

您可以稍后检索该类并向其发送消息:

Class theClass = someArray[index];
id object = [[theClass alloc] init];

如果您需要能够查询title属性的每个类对象,则需要在添加到数组的每个类上实现。例如,这是一个实现这种类属性的类方法:

+ (NSString*) title
{
    return @"Blah, blah, blah";
}

您可以使用以下代码获取它:

Class theClass = someArray[index];
NSString* title = [theClass title];
// ... code which uses the title ...