从其他类访问方法Objective-C

时间:2009-11-01 21:40:01

标签: iphone objective-c class object methods

寻找这个问题的答案,但我还没找到合适的答案。我希望你们(和女孩们)可以帮助我! (这适用于iPhone应用程序)

好的,我有一个Mutliview应用程序。每个视图都有自己的类,一切都很开心。但是,不同的类有时会调用相同的方法。到目前为止,我只是在两个类文件中编写了两次Method。

这就是我想要做的事情:

我想在它自己的文件中创建一个具有所有“常用”方法的新类。然后,每当另一个类需要调用Method时,我只需从另一个文件中调用它。这样,当我想要改变方法时,我只需要在一个地方改变它,而不是所有地方......

我不确定我是怎么做到的,这就是我寻求帮助的原因。对于Objective-C我有点生疏和新的,所以漂亮的例子对我很有帮助。请允许我给你一个。

文件:ViewController1.m

@implementation ViewController1

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

文件:ViewController2.m

@implementation ViewController2

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

文件:CommonClass

@implementation commonClass

- (void)CommonMethod:(id)sender
{

//So some awesome generic stuff...



    }
@end

我觉得我需要#import另一个文件,从类中创建一个Object并从Object调用Method ...我该怎么做?

再次感谢!

8 个答案:

答案 0 :(得分:26)

选项1:

@implementation commonClass
+ (void)CommonMethod:(id)sender  /* note the + sign */
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    [commonClass CommonMethod];
}


@end

选项2:

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    commonClass *c=[[commonClass alloc] init];
    [c CommonMethod];
    [c release];
}

@end

选项3:使用继承(参见Totland先生在此主题中的描述)

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

/* in your .h file */
@interface ViewController2: commonClass

@end

自然你总是需要在视图控制器中#import commonClass.h ..

答案 1 :(得分:6)

这里有一些答案告诉你要创建一个共同的“父”类。但是我认为你可以做得更好。而是为UIViewController创建一个category。你不知道UIViewController发生了什么的所有内部因此我认为值得创建自己的View Controller层次结构。实际上它可能很危险。当我尝试创建一个“基础”UITableViewController,然后创建从中继承的类时,我遇到了许多问题。我通过使用类别来避免这些问题。

你的#1优先级不应该是没有充分理由继承的东西,它应该是一个应用程序进入人们想要下载的应用程序商店。

答案 2 :(得分:3)

听起来像公共代码根本不需要在类中。有没有理由你不能只使用C风格的功能来做你想做的事情?

您可以将公共代码放在一个类中,然后将另外两个类作为该类的子类;这种方法也避免了代码重复。

另一种选择可能是为这个公共代码编写一个类方法而不是实例方法。我认为大多数人都认为单身人士最好避免作为设计选择。

如果我们更了解你真正想要实现的目标,那么给出一个好的答案会更容易。

答案 3 :(得分:3)

您要做的是让两个控制器共享一个共同的超类:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2
然后

commonMethod:将驻留在MyAwesomeViewController中。另外,不要使用大写字母启动方法名称。 :)

详细说明:

+@interface MyAwesomeController : UIViewController {

-@interface ViewController1 : UIViewController { // and ditto for ViewController2
+@interface ViewController1 : MyAwesomeController {

答案 4 :(得分:1)

请记住,Objective-C只是C的超集,虽然#include指令主要用于头文件,但是没有什么能阻止你使用#include将一个实现的内容嵌入到另一个实现中。如果代码真的相同,您可以轻松地将其粘贴在自己的文件中,并将其包含在.m文件中。

话虽如此,也许将这种技术与类别结合使用会更好,特别是如果相同的实现具有相似的行为。

答案 5 :(得分:1)

在分配和初始化视图时传递对commonClass的引用...

CommonClass *cc = [[CommonClass alloc] init];

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc];
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc];

但制作经典的c包含可能就足够了。

答案 6 :(得分:0)

作为一个具有Java背景和小C的iPhone新手,我有一个类似的问题,希望在RootController和ViewController中引用一个方法。在我看来,该方法的适当位置是AppDelegate类,该实例在其他类中通过以​​下方式获得:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

然后如果方法是“doSomething”,则可以通过以下方式访问它:

[delegate doSomething];

但也许这太明显或不需要。

答案 7 :(得分:0)

您可以使用的另一种方法

@interface ServerManager : NSObject

+(ServerManager *)getInstance;

@implementation ServerManager

+(ServerManager *)getInstance
{
static ServerManager *objServerManager = nil;

if(objServerManager==NULL){
objServerManager=[[self alloc] init];
}
// Return the servermanager object.
return objServerManager;
}

通话是否要使用

ServerManager *SMObject =   [ServerManager getInstance];

不要忘记导入servermanager.h文件。