寻找这个问题的答案,但我还没找到合适的答案。我希望你们(和女孩们)可以帮助我! (这适用于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 ...我该怎么做?
再次感谢!
答案 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文件。