2009-11-01 10 views
19

この質問の回答を探しましたが、まだ適切なものが見つかりませんでした。私はあなたたち(そしてギャルたち)が私を助けてくれることを願っています!他のクラスからのアクセス方法Objective-C

いいえ、私はMutliviewアプリケーションを持っています。各ビューには独自のクラスがあり、すべてが幸せです。しかし、異なるクラスは同じメソッドを呼び出すことがあります。これまで、私は単にクラスファイルの両方にメソッドを2回書きました。

これは、私も何をしたいです:

私はすべての「共通」メソッドを持っているそれ自身のファイルに、新しいクラスを作りたいです。次に、別のクラスがメソッドを呼び出す必要があるときは、単に別のクラスから呼び出します。この方法では、メソッドを変更したいときは、すべての場所ではなく、1か所で変更するだけです...

私はこれをどうやって行うのか分かりません。私は助けを求める。私は少し錆びていて、Objective-Cのために新しいので、かなりの例が私をたくさん助けます。私にあなたに1つを与えることを許可します。

ファイル: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する必要があるように私は感じて

、クラスからオブジェクトを作成し、オブジェクトからメソッドを呼び出す...どうすればいいですか?

もう一度おねがいします!

答えて

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に。

+0

こんにちは、ここでcommonClassのスーパークラスは何ですか? 私は、私は多くの異なるクラスから呼び出す必要がある1つのメソッドを持っているので、そのためのベストプラクティスは何でしょうか? –

+0

ARCモードで '[property release] 'は許可されていますか?コンパイラは許可されていないと私に伝えています。 – tymac

+0

@tymacこの投稿はARCの前の2009年のものです。 –

3

一般的なコードがクラスにはまったく必要ないように聞こえます。あなたがやりたいことにCスタイルの関数を使うだけの理由がありますか?

共通コードをクラスに入れて、他の2つのクラスをそのサブクラスにすることができます。この方法でもコードの重複は回避されます。

この共通コードのインスタンスメソッドの代わりにクラスメソッドを記述することもできます。ほとんどの人は、シングルトンはデザインの選択肢として避けるのが最善だと感じていると思います。

あなたが実際に達成しようとしていたことについてもっと知っていれば、良い答えを出す方が簡単でしょう。あなたが何をしたいか

+0

これは継承を利用しないという問題です。 –

+0

ありがとうございます。 Class1でメソッド(method1)がありました。 Class1.hで宣言し、Class1.mで実装しました。私はClass2を持って、それはセレクタを持っています:@セレクタ(method1)。この場合、どうすればいいですか? –

+1

@Williham、それはそうであるように思えます。 @ srikanth、多分あなたはここにコメントを投稿するのではなく、質問をする必要がありますか? –

3

は二つのコントローラが共通のスーパークラスを共有することです:

UIViewController : MyAwesomeViewController : ViewController1 
              : ViewController2 

commonMethod:その後、MyAwesomeViewControllerに常駐します。また、メソッド名を大文字で開始しないでください。 :)

詳しく説明するには:

[email protected] MyAwesomeController : UIViewController { 

[email protected] ViewController1 : UIViewController { // and ditto for ViewController2 
[email protected] ViewController1 : MyAwesomeController { 
+0

+1の継承は道のりです。 –

1

クマを念頭に置いてのObjective-CはCだけのスーパーセットであり、かつの#includeディレクティブは、主にヘッダファイルのために使用されている一方で、#を使って、あなたを止めるものは何もありませんということある実装の内容を別の実装に埋め込むことができます。コードが本当に同一であれば、それを自分のファイルに貼り付けるだけで、#.mファイルに#includeすることができます。

これは言いますが、おそらく同じ手法でも同じような振る舞いがある場合は、この手法をカテゴリと組み合わせて使用​​する方がよいでしょう。

1

あなたcommonClassへの参照を渡すあなたがALLOCとあなたの意見を初期化...

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

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

が、古典的なCを作るには十分かもしれません含まれています。

6

共通の「親」クラスを作成するための答えがあります。しかし、私はあなたがもっと良いことをすることができると思います。かわりにUIViewControllerのcategoryを作成してください。 UIViewControllerで何が起こっているのか、内部のすべてを知るわけではないので、View Controllerの独自の階層を作成する価値はないと思います。実際それは危険である可能性があります。私は "基本" UITableViewControllerを作成し、それから継承するクラスを作成しようとしたときにいくつかの問題に遭遇しました。カテゴリを使う代わりに、これらの問題を回避しました。

あなたの#1の優先順位は正当な理由で物を継承するべきではなく、人々がダウンロードしたいアプリをアプリストアに取得する必要があります。

+0

+1最後のパラ... –

0

JavaのバックグラウンドとCがほとんどないiPhoneの新機能として、RootControllerとViewControllerの両方のメソッドを参照したいという同様の問題がありました。

:メソッドがあるならば、「doSomethingの」1はでそれにアクセスする

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

:方法のための適切な場所がAppDelegateクラス、1がで他のクラスに取得したのインスタンスだったように私には思えました

[delegate doSomething]; 

しかし、おそらくこれはあまりにも明白であるか、必要なものではありません。

0

あなたが

ServerManager *SMObject = [ServerManager getInstance]; 

を使用するかどうか

@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.hファイルをインポートすることを忘れないでください。使用することができるもう一つの方法。

関連する問題