寻找这个问题的答案,但我还没有找到一个合适的呢。 我希望你们(和加尔斯)可以帮我! (这是一个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