0

現在の(マイナーな)問題については、以下の編集を参照してください


MainViewController.m と FlipsideViewController.m の「間」で、あるファイル/クラスから別のファイル/クラスにメソッド(関数ではなく、メソッドが正しいですか?)を呼び出そうとしています。

これはよく「別のクラスからメソッドを呼び出す」と呼ばれるものだと思います。そのような質問がたくさんあることは知っていますが、正しく機能させることができません。

私の場合、上記の両方のファイルにいくつかのユーザー定義のメソッド/関数があります。場合によっては、 MainViewController.m File 内にある FlipsideViewController.m 内からメソッドを呼び出す必要があります

// in MainViewController.m

- (void) calculateDays {
    //executes caluculations
   // inserts data into labels, etc 
}

この関数を単に同じファイル内から呼び出したい場合は、次のようにします。

[self calculateDays];

それは簡単ですが、FlipsideViewController.m ファイル内からもこの関数を呼び出したいと思います。逆も同様です。では、これを行うにはどうすればよいですか?thisthis、およびthisの質問は一種の答えですが、私にはうまくいきません。その理由をすぐに説明します。

これは私が試したもので、うまくいくと思います:

MainViewController *mvs = [[MainViewController alloc] init]; //alloc init MVC
[mvs calculateDays]; //call "external" function

それは私にエラーを与えます: "Unknown type name MainViewController"そのため、機能させるには何らかの方法でインクルード/インポートする必要があると思います(javascriptやPHPのように)。したがって、FlipSideViewController.m クラスに含めます。

 #import "MainViewController.h"

これまでのところエラーはありません。次に、それをコンパイル/ビルドしようとすると、別のエラーが発生します: 「clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)」

これにより、FlipSideViewController クラスのコードに干渉する可能性のある他の多くのものをインポートするため、そのように MainViewController をインポートするのは適切ではないと思います。

同様の解決策を試しましたが、何もうまくいかないようです。私が間違っていることと、おそらくこれを適切に行う方法を誰かに説明してもらえますか: MainViewController.m と FlipsideViewController.m の間でメソッドを呼び出します。


H2CO3によって提案された解決策は、ほとんどの問題を解決しました(XCode はしばらくバグがあり、ランダムなエラーが発生し、プロジェクト全体を再構築する必要がありました) が、まだうまくいかないことが 1 つあります。 (UIアウトレット) . あなたの誰かがこれで私を助けることができるかどうか見てください:

メソッドが自分自身 (つまり [self calculateDay]) 内から呼び出されると、値が UILabel に正常に挿入されます。FlipsideViewControllerから呼び出されると、挿入される値が存在し、正常に処理されますが、UILabel に挿入できません。以下をご覧ください。

いくつかのログ:

//method called from within self on viewDidLoad: [self calculateDay];
Processed value to update label with: 26
New value in outlet after having been inserted: 26


//method called from another (FlipsideViewController) class file: [mvs calculateDay];
Processed value to update label with: 26
New value in outlet after having been inserted: (null)

/* 
  This doesn't work either from that external file: 
  [[mvs LabelName] setText:@"Hello, update label!"]; no errors but no display either

*/
4

2 に答える 2

2

代わりにヘッダーをインポートすると、必要なすべての宣言が得られますが、「重複シンボル」リンカー エラーは発生しません。これは、(Objective-)C コードを記述するための「標準」/一般的な方法です。

#import "MainViewController.h"
                            ^
      ".h" instead of ".m" -+
于 2013-01-05T17:07:48.240 に答える
0

(素人の用語)Objective-Cでは、各ファイルが認識しているオブジェクトのみを使用できます。この例では、FlipsideController.mファイルでMainViewControllerを使用しようとしています。FlipsideController.mは、MainViewControllerが何であるかを認識していないため、それが何であるか、またはその使用方法がわからないため、エラーをスローします。FlipsidecontrollerにMainViewControllerとは何かを伝えるには、2つのオプションがあります。ヘッダー()をインポートする#import "MainViewController.h"と、FlipSideController.hで定義されているすべてのものに完全にアクセスできます。(自分が何をしているのかを本当に理解していない限り、おそらく.mをインポートしないでください)@class FilpsideController.hに前方宣言を作成し、.mにファイルをインポートすることもできます。これは、循環インポートなどを回避するのに役立ちます。

于 2013-01-05T17:12:59.737 に答える