2011-08-08 6 views
1

すべてのUIViewControllerにメソッドをアタッチする必要があります。メソッドは、私の主なアプリケーションデリゲートクラスオブジェクトへのポインタを返します。ただし、xcode 4は、出力パラメータタイプMyAppDelegateの宣言で、ヘッダファイル内に「解析問題が発生しました」というエラーをスローします。私が他のタイプ(例えばid)に変更した場合、エラーは消えてしまいます。しかし、私は主なアプリケーションデリゲートのプロパティにアクセスするためのドット構文を使用しています。もしxcode4が主なアプリケーションデリゲートのプロパティを認識しない場合、型をidに変更します。私は、このメソッドにアクセスしているUIViewControllerクラスファイルにカテゴリの定義ファイルを含めました。ここで連鎖されたメソッドにアクセスするときに、カテゴリでドット構文を使用できますか?

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "MyAppDelegate.h" 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; // xcode 4 complains about MyAppDelegate type, though it autocompletes it and show even in green color. 

@end 

実装されています:

#import "MyCategory.h" 

@implementation UIViewController (MyCategory) 

-(MyAppDelegate *)appDelegate{ 
    MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 

編集:ここに私のカテゴリーの定義がある私は、このカテゴリを実装していた理由は、私は私のメインのアプリにアクセスするための便利なショートカットを持っている必要があるということです

// handy shortcut :) 
self.appDelegate.someMethod; 

//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
+1

MyAppDelegateはどのように宣言されていますか? –

+0

@interface MyAppDelegate:NSObject 。 UIApplicationDelegateプロトコルを実装するだけです。 – Centurion

+0

それから、代わりに 'id delegate = ...'を試してください。 –

答えて

1

私はあなたのヘッダファイルに依存関係のサイクルがあると思います。 MyAppDelegate.hMyCategory.hを直接的または間接的にインポートする場合、最初にカテゴリ宣言がコンパイルされると、コンパイラはMyAppDelegateが何であるかを知りません。あなたはMyCategory.hヘッダからMyAppDelegate.hのインポートを削除し、前方クラス宣言に置き換える必要があります。

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@class MyAppDelegate 

@interface UIViewController (MyCategory) 

-(MyAppDelegate *) appDelegate; 

@end 

そして、代わりに.mファイルにインポートを置きます。これは実際には良い一般原則です。可能であれば、ヘッダーで前方クラス宣言を使用し、実装ファイルにインポートを配置します。

+0

ありがとうございました。 – Centurion

1
-(id)appDelegate{ 
    return [[UIApplication sharedApplication] delegate]; 
} 

//Calling code 
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate]; 
+0

+1。そのようなローカライズされたメソッドのシグネチャを高水準のフレームワーククラスに組み込むことが悪い考えをなぜ指摘すれば、さらに良いでしょう。 – Perception

+0

長いコード行の代わりに便利なショートカットが必要なので、カテゴリに入れています。私が持っているとしようとしているショートカットは、プロパティのように振る舞いますが、単なるメソッドになります。私の場合は、self.appDelegate.somePropertyのような私の主なアプリケーションデリゲートにアクセスしたいと思います。 – Centurion

+0

@受け取り:タイプキャストを入れなければならないのはどのようにクリーンなデザインですか? – JeremyP

0

を追加します(UIViewControlerオブジェクトから私の場合)コードの任意の場所から委任をカテゴリヘッダーの先頭に追加して、このクラスが存在することをコンパイラに知らせるか、または#importのヘッダーをコンパイラに通知させます。

一般的には、同じことを行うMyAppDelegateにクラスメソッドを持たせることをお勧めします。概念的には、appDelegateは、メソッドが示す個々のView Controllerのプロパティではありません。

+0

私は自分のアーキテクチャを改善しようとしています。私のアプリは6つのUIViewController画面を持ち、すべてのMVCは画面上で他のMVCをポップ/プッシュします。私は各UIViewControllerのすべてのMVCへのポインタを持っている必要があります。しかし、私はポインタソリューションを好まなかった。私はまた、通知の使用についての考えが気に入らなかった。次に、メインのアプリケーションデリゲートクラスの画面に必要なすべてのポインタを用意し、sharedApplicationを使用してそれらにアクセスするようアドバイスしました。しかし、アクセスコードはかなり長いので、私はself.appDelegate.someMyUIViewControllerのようなショートカットを持っていたいと思います。しかし、カテゴリで作業することができませんでした。 – Centurion

関連する問題