0

2分間表示されるビュー(スプラッシュ画面)があります。

- (void)applicationDidFinishLaunching:(UIApplication *)application

{

[viewController showSplash];

}

- (void)showSplash // Show splash screen
{
 UIViewController *modalViewController = [[UIViewController alloc] init];
 modalViewController.view = modelView;
 [self presentModalViewController:modalViewController animated:NO];
 [self performSelector:@selector(hideSplash) withObject:nil afterDelay:120.0]; 
}

このスプラッシュ画面に、2分からゼロまでカウントダウンするタイマーを追加したいと思います。

タイマーを含む別のビューを作成する必要があると思います。これは正しいです?これを行ってスプラッシュ画面に追加するにはどうすればよいですか?また、タイマーの数字を画面に白で表示するにはどうすればよいですか?

スプラッシュ画面を表示するのに2分かかるのは非常に長い時間ですが、私はさまざまなことを試しているだけです。2分間は他にもいろいろなことが起こっています。

どうもありがとう、

Stu

編集//わかりました私は今これを持っています:

(.h)

NSTimer *timer5;
    UILabel *countDown;
    float timeOnSplash;

(.m)

- (void) updateLabel:(NSTimer*)theTimer 
{
    float timeOnSplash = timeOnSplash - 1;
    countDown.text = [NSString stringWithFormat:@"%02d:%02d", timeOnSplash];
}


- (void)applicationDidFinishLaunching:(UIApplication *)application

{

    timer5 = [NSTimer scheduledTimerWithTimeInterval:1

        target:self
        selector:@selector(updateLabel:) 
        userInfo:nil
        repeats:YES];

    countDown.text = [NSString stringWithFormat:@"%02d:%02d", timeOnSplash];
}

コードを実行すると、次のキャッチされない例外が発生します。

'NSUnknownKeyException'、理由:'[setValue:forUndefinedKey:]:このクラスはキーカウントダウンのキー値コーディングに準拠していません。

何か案は?

編集2//現在作業中です。優れたソリューションについては、TechZenの回答を参照してください。

みんなありがとう!

4

4 に答える 4

3

NSTimersは、それらを作成するオブジェクトではなく、アプリケーションNSRunLoopインスタンスにアタッチするという点で珍しいオブジェクトです。タイマーがワンショットの場合、タイマーへの参照を保持する必要はありません。あなたはタイマーを開始し、それを忘れるべきです。

あなたの場合、2つのトラックの2つの時間間隔が必要です(1)インターフェイスを更新できるように1秒ごとに通過し、(2)合計2分の間隔を通過します。

(1)の場合、インターフェースを更新するmodalviewcontrollerのメソッドを呼び出す1秒間隔の繰り返しタイマーを呼び出す必要があります。タイマーを呼び出すのに最適な場所は、コントローラーのviewDidAppear方法です。(2)の場合、159の値を格納するコントローラーのプロパティを持ち、タイマーによって呼び出されるメソッドに、メソッドが呼び出されるたびにそれをデクリメントさせることができます。ゼロに達すると、タイマーが無効になります。

タイマーは、runloopがすべてのイベントを処理する速度の影響を受けることに注意してください。数マイクロ秒ごとに一時停止しない集中的なバックグラウンドプロセスがある場合、タイマーが時間どおりに起動しない可能性があります。この問題が発生した場合は、スプラッシュ画面と構成用に個別のスレッドを作成することを検討する必要があります。

なぜスプラッシュ画面を正確に2分間表示する必要があるのか​​疑問に思う必要があります。


余談ですが、iPhoneのヒューマンインターフェイスガイドラインには、スプラッシュスクリーンを使用しないように明記されています。アプリが拒否される可能性があります。長くぶら下がっているスプラッシュ画面を使用すると、アプリまたは電話が失敗したという印象を与え、Appleもそれを嫌います。

アプリを使用する前に実行する必要のある強力な構成がある場合は、処理中の構成を表示するインターフェースを作成することをお勧めします。そうすれば、アプリが機能しているだけでなく、ハングしていることも明らかです。

さらに良いことに、移動中の誰も静的なiPhoneアプリを2分間見つめたくないので、アプリが別のスレッドで構成されている間に、ユーザーが1つのスレッドで何かを始められるようにすることをお勧めします。たとえば、ある種のURL接続では、アプリが接続を確立している間に、ユーザーがデータの一部とアドレスを入力し始めることができます。ゲームの場合、ユーザーにユーザー名の選択、ハイスコアの確認、手順の表示などを行わせることができます。

設計プロセスでは、主に時間を節約できるという理由で、人々がiPhoneでアプリを使用することを覚えておく必要があります。彼らはラップトップをドラッグしたり、コンピューターに行ってタスクを実行したりする必要はありません。アプリの設計では、ユーザーのタスクをできるだけ早く実行することに重点を置く必要があります。ゲームの場合でもそうです。

通常、私は時期尚早の最適化に対して警告しますが、これは一種の大きな問題です。

Edit01:

スプラッシュスクリーンコントローラにこのようなものが必要です。

@interface SplashScreenViewController : UIViewController {
    NSInteger countDown;
    IBOutlet UILabel *displayTimeLabel;
}
@property NSInteger countDown;
@property(nonatomic, retain)   UILabel *displayTimeLabel;
@end

#import "SplashScreenViewController.h"

@implementation SplashScreenViewController
@synthesize countDown;
@synthesize displayTimeLabel;

-(void) viewDidAppear:(BOOL)animated{
    countDown=120;
    NSTimer *secTimer=[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountDown:) userInfo:nil repeats:YES];
}//------------------------------------viewDidAppear:------------------------------------


-(void) updateCountDown:(NSTimer *) theTimer{
    NSInteger mins,secs;
    NSString *timeString;
    countDown--;
    if (countDown>=0) {
        mins=countDown/60;
        secs=countDown%60;
        displayTimeLabel.text=[NSString stringWithFormat:@"%02d:%02d",mins,secs];

    } else {
        [theTimer invalidate];
        // do whatever you wanted to do after two minutes
    }

}//-------------------------------------(void) updateCountDown------------------------------------
@end
-------
于 2009-12-06T15:55:29.923 に答える
0

NSTimerを使用すると、毎秒何らかのメソッドを呼び出すことができます。そこで、モーダルViewControllerのビューを変更できます(たとえば、ラベルのテキストを変更すると、時間が表示されます)。メソッドが120回呼び出されると、タイマーが無効になります。

于 2009-12-06T11:50:55.953 に答える
0

@Morionが提案したようにNSTimerを使用できます。別の方法は次のとおりです。

@interfaceファイルに、変数を追加します。

NSInteger   countDown;

次に@implementationで:

- (void)showSplash // Show splash screen
{
    UIViewController *modalViewController = [[UIViewController alloc] init];
    modalViewController.view = modelView;
    [self presentModalViewController:modalViewController animated:NO];
    countdown = 120;
    [self performSelector:@selector(updateTime) withObject:nil afterDelay:1.0];
}


- (void)updateTime {
    //decrement countDown
    if(--countDown > 0){
        //
        // change the text in your UILabel or wherever...
        //
        //set up another one-second delayed invocation
        [self performSelector:@selector(updateTime) withObject:nil afterDelay:1.0];

    }else{
        // finished
        [self hideSplash];
    }
}
于 2009-12-06T12:44:39.633 に答える
0

[UIColor clearColor]はい、1つの方法は、透明な背景( )と白いテキストのラベルを持つ新しいビューを作成することです。呼び出すだけ[modalViewController.view addSubview:timerView]で、サブビュー/オーバーレイとして追加できます。

実際にビューを作成したり、ラベルを設定したりするのにどれだけの助けが必要かわかりません。

于 2009-12-06T12:45:24.967 に答える