2011-02-05 2 views
0

私はこのクラスにデリゲートメソッドを持っています。デリゲートにはnavigationControllerがあります。iPhone - クラス内で未知のゲッターメソッドにアクセスする

このナビゲーションコントローラーにそのクラスの中からメッセージを送信しようとしています。ような何か:エラー:アクセス不明 'navigationController' getterメソッド

私は、デリゲートの内側だとき、私は

self.navigationController 
を使用して、そのnavigationControllerにアクセスすることができます

[delegate.navigationController setNavigationBarHidden:NO]; 

私がメッセージを受信して​​います

このクラスでゲッターを設定すると、これは機能しますか?

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

+0

は、デリゲートのnavigationControllerのプロパティですか?ドット表記でプロパティにアクセスすることしかできません。 – jakev

+0

私はこれを持っています:メインアプリケーションデリゲート> RootViewController> MyClass ... navigationControllerは主なアプリケーションデリゲートのプロパティですが、self.navigationControllerを使用してRootViewControllerからアクセスできます。今私はMyClassにいる。 RootViewControllerはMyClassのデリゲートです。 MyClassからnavigationControllerにアクセスするにはどうしたらいいですか? – SpaceDog

答えて

2

navigationControllerは、一般的なUIViewControllerのプロパティです。あなたがのUIViewController *にdelegateをキャストした場合、エラーが消えます:あなたはより良いdelegateが実際のUIViewControllerのインスタンスであることを確認してくださいと思います

[((UIViewController *)delegate).navigationController setNavigationBarHidden:NO]; 

注意を。そうしないと、アプリがクラッシュします。

EDIT:

((UIViewController *) delegate).navigationController; 

なぜ、ネストされた括弧:私の頭の上から、上記の例を使用してCのポインタをキャストするには3つの方法は、ありますか。 (UIViewController *) delegate.navigationControllerは演算子の優先順位のために(UIViewController *) (delegate.navigationController)に相当するためです。

[(UIViewController *) delegate navigationController]; 

ここでは、UIViewControllerにデリゲートをキャストしてメッセージを送信します。

UIViewController *myViewController = (UIViewController *) delegate; 
[myViewController navigationController]; // or myViewController.navigationController; 

これらはすべて機能的に同等です。私は手足に出て、それを選択するスタイルの問題だと言います。

+0

PEEEERRRRRRRRRRRRRFFFFFFFFFFFFFEEEEEEEEEEEECCCCCCCCCTTTTTTTTT !!!!!!!!!ありがとう!!!!!!!!!!!!!! – SpaceDog

+0

これの背後にある論理を私に説明できますか?私は((UIViewController *)デリゲートが何をしているのか理解できません)。デリゲートがすでにviewControllerである場合、なぜそれがviewControllerであるのかをXcodeに伝えなければならないのですか? myPropertyのような、その代理人のプロパティにアクセスしようとしていたとします。どのように私はそれにアクセスすべきですか? – SpaceDog

+0

あなたが* delegatedを宣言した方法を見てください。例えば、 'id'と宣言されている場合、コンパイラはそれが* id *であると判断しますが、idの型のオブジェクトはプロパティを持たないのでエラーになります。単純に 'delegate'を' UIViewController * 'として宣言することもできます(コードでは便利でない場合)。単純に' id'を 'UIViewController *'にキャストするだけで、基本的に別の構造体へのポインタにすることができます。 – Costique

0

このメソッドを呼び出すクラスのデリゲートの型は?それがidならば、それはnavigationControllerメソッドについて知らないのです。デリゲートを毎回同じ場合はデリゲートを実際のクラスにキャストし、そのクラスのヘッダーファイルをインポートして、メンバのnavigationControllerがあることを知ることができます。また、デリゲートファイル内でnavigationControllerをプロパティとして設定していない可能性もあります。

関連する問題