从其他类Objective-C的访问方法(Accessing Method from other C

2019-09-03 15:21发布

寻找这个问题的答案,但我还没有找到一个合适的呢。 我希望你们(和加尔斯)可以帮我! (这是一个iPhone应用程序)

好吧,我有一个Mutliview应用。 每个视图都有它自己的阶级,一切都是幸福的。 然而,不同类别有时调用相同的方法。 到现在为止,我只是写了两次的方法,同时在类文件。

这就是我想要做虽然:

我想打一个新的类,在它自己的文件,具有所有“公共”的方法。 然后,每当其他类需要调用的方法,我只是从其他文件调用它。 这样,当我想改变的方法,我只需要改变它在一个地方,而不是所有的地方...

我不知道我怎么会做这个,这就是为什么我寻求帮助。 我对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其他文件,从类使一个对象,并调用从对象的方法......我该怎么办呢?

再次感谢!

Answer 1:

选项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:使用继承(见托特兰先生在这个线程说明)

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

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

@end

当然,你总是需要#import commonClass.h在您的视图控制器..



Answer 2:

这里有一些答案告诉你创建一个普通的“父”类。 不过,我认为你可以做得更好。 创建一个类别为UIViewController中代替。 你不知道这一切是怎么回事用的UIViewController的内部的,所以我不认为这是值得创建自己的视图控制器层次关闭的。 事实上,它可能是危险的。 我遇到了一些问题,当我试图建立一个“基地”的UITableViewController,然后创建一个从继承的类。 我避免使用类别,而不是这些问题。

你的#1的优先级不应该被继承的东西没有很好的理由,应该得到一个应用进入App Store,人们将要下载。



Answer 3:

这听起来好像通用代码并不需要在一个类的。 有没有你不能只用你想要做什么C风格的功能的原因是什么?

您可以把常用的代码在一个类,然后做出一个你的其他两个类的子类; 该方法还避免了代码重复。

另一种选择可能是写一个类的方法,而不是实例方法为这个共同的代码。 我想大多数人都觉得单身最好的设计选择回避。

它会更容易给出很好的答案,如果我们知道更多关于你真正想要实现。



Answer 4:

你想要做的就是让两个控制器都有一个共同的超类:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2

commonMethod:随后将驻留在MyAwesomeViewController。 另外,不要启动以大写字母方法名。 :)

详细说明:

+@interface MyAwesomeController : UIViewController {

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


Answer 5:

请记住,Objective-C的仅仅是一个C的超集,并且,虽然#include指令主要用于头文件,没有什么用的#include嵌入另一个实现内部一个实现的内容阻止你。 如果代码确实是相同的,你可以很容易地只是把它贴在自己的文件,并在.m文件#包括它。

说了这么多,也许这将是更好与类别结合使用这种技术,特别是在相同的实现也有类似的行为。



Answer 6:

传递到您的commonClass参考,当你alloc和初始化你的意见......

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

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

但制作经典的C包括可能就够了。



Answer 7:

作为iPhone新手与Java的背景和小C,我希望是指一种方法,既RootController和视图控制器类似的问题。 在我看来,对于方法的适当位置是AppDelegate类,其中一个在其他类通过获取实例:

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

然后,如果方法是“doSomething的”一个访问它由:

[delegate doSomething];

但也许这是太明显或不被需要什么。



Answer 8:

您可以使用另一种方法

@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文件。



文章来源: Accessing Method from other Classes Objective-C