4

私はXcodeでiPhone用のiOSアプリを作成しており、それぞれの.hファイルと.mファイル内にいくつかのクラスとそのメソッドを作成しました(これは2つのクラスなので、基本的に.hと.mファイルのペアが2つあります)

ここで、ユーザーが再生ボタンを押すたびに実行されるメインループの作成を開始したいのですが、正確にはどこで実行しますか?

ViewController.mでそれを行いますか?たとえば、このメソッド内:

- (IBAction)playPressed:(UIButton *)sender 
{
    // main loop executed in here ?
    // or simply message to the main loop to start executing is *sent* from here ?
}

私はここで同様の質問について読みました、そして誰かがAppDelegateを提案していました。これで、AppDelegate.mまたはAppDelegate.hになりますか?その場合は、コードを書き始めるだけですか、それとも次のようなものの中にすべてを含めますか?

int main(int argc, char **argv)
{
   ....
}

Appdelegateファイルで?

作成したgame.mファイルでクラスのインスタンス化とジェネリックメソッド(特定のクラスに属していない)の宣言を開始しようとしましたが、初期化要素がコンパイル時定数の警告ではないことを確認しました。何かをインスタンス化する

何か助けはありますか?C ++から来ると、メインループを作成するためのファイルと、それをある種のint main()関数でラップする必要があるかどうかを明確にするのに役立ちます。

ありがとう!

PS:

違いが生じた場合に備えて、ViewControllerは、メインループが押されるたびに実行を開始する再生ボタンと、メインループの実行を終了する停止ボタンのみで構成されます。

ViewController.mでそれぞれのメソッドを作成しました:

- (IBAction)playPressed:(UIButton *)sender 
{
    // 
}

- (IBAction)stopPressed:(UIButton *)sender 
{
    //  ??
}

とりあえず空です:)

4

3 に答える 3

2

iOSでのプログラミング方法は、C++方法とは異なります。実際、C ++では、無限ループを作成して、各フレームでタッチを取得したり、すべてを描画したりする必要があります。プレイヤーが「終了」を押してループを解除するまで。iOSでは、処理方法が異なります。main関数を含むmain.mファイルが既にあります。これでアプリデリゲートが起動します。そのアプリデリゲートは、アプリの起動が終了したとき、バックグラウンドに移動したとき、フォアグラウンドに移動したときなどを通知します。アプリの起動が終了すると、最初の実際の画面に移動します。そこで、サブビューを追加します。各フレームで描画することはありません。ビューを親ビューに追加すると、これは自動的に行われます。iOSでのプログラミングは、イベントに基づいています。あなたはしません タッチをチェックし、タッチ位置がボタン上にあるかどうかを確認してから、そのボタンのメソッドを呼び出す必要があります。代わりに、ボタンのコールバックメソッドを設定すると、ボタンが押されると自動的に呼び出されます。もちろん、最初にボタンを割り当てて、それを親ビューに追加する必要があります。

このイベントベースのプログラミングモデルに慣れたら、きっと気に入るはずです。最初は継ぎ目が大きく異なる場合があり、意味がない場合もありますが、心配する必要はありません。C ++のバックグラウンドから来ることは、確かに良いスタートです。

乾杯、

ジョージ

編集:その場合、私はより具体的な情報を与えることができます:それで、あなたは最初の画面のAppDelegateから行きます。それをMainAppScreenと呼びましょう。次に、これら2つのボタンを追加し、それらのセレクター(コールバックメソッド)を設定する必要があります。私はあなたがすでにそれをしたのを見ることができます。

今 :

- (IBAction)playPressed:(UIButton *)sender
{
    running = TRUE;
    [self performSelectorInBackground:@selector(myLoop) withObject:nil];
}
- (IBAction)stopPressed:(UIButton *)sender 
{
    running = FALSE;
}
- (void) myLoop
{
    while(running)
    {
       //this is your loop. You can code in here.
    }
}

実行中は、MainAppScreenクラスのインスタンス変数です。

お役に立てれば。

乾杯!

于 2012-07-06T13:38:22.993 に答える
1

すべてのiOSアプリ、およびすべての実行可能ファイルにはエントリポイントがあります。これがmain()です。実行可能ファイルのエントリポイントを複数持つことはできません。プロジェクトを詳しく調べると、Xcodeのナビゲーターmain.mのグループに自動生成されたファイルがあります。これは次のようになります。Supporting Files

#import <UIKit/UIKit.h>

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

やりたいことは十分に明確ではありませんが、iOSアプリの構造とライフサイクル、Objective-c構文について読み、UIKitAppleが提供するフレームワークの少なくとも一部に精通することをお勧めします。

于 2012-07-06T13:29:40.817 に答える
1

iOSアプリにはありませんmain(技術的にはメインがありますが、それを書くことを心配する必要はありません)。それはすべてあなたのために処理されます。runloopはすべてあなたのためにも行われます。ボタンを作成し、ボタンが押されたときに実行するメソッドを(addTargetメソッドを介して)指示するだけです。

更新:これは、あなたがしなければならないことのための疑似(っぽい)コードです...。

[startButton addTarget:@selector(startPressed:)];
[stopButton addTarget:@selector(stopPressed:)];

-(void)startPressed {
  backgroundThread = [[NSThread alloc] initWithWhateverYouWantToRun];
  [backgroundThread start];
}

-(void)stopPressed {
  [backgroundThread stop];
}

バックグラウンドスレッドで、UIを更新する場合は、電話をかけますsendMessageOnMainThread(または、類似したもの-現時点では正確な詳細を思い出せません!)

于 2012-07-06T13:29:56.010 に答える