• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:iPhoneアプリ開発 NSTimerとの同期)

iPhoneアプリ開発でNSTimerとの同期は?

このQ&Aのポイント
  • iPhoneアプリを開発中の方への質問です。NSTimerを使って文章を一文字ずつテキストに表示させる処理を実装していますが、表示が完全に終わる前に別の処理が走ってしまう問題が発生しています。NSTimerの処理との同期の取り方を教えていただきたいです。
  • 現在、iPhoneアプリを開発中ですが、NSTimerを使ってテキストを一文字ずつ表示する処理を実装しています。しかし、表示が完全に終わる前に別の処理が実行されてしまうことがあります。この問題を解決するために、NSTimerの処理との同期を取る方法を教えていただけないでしょうか?
  • iPhoneアプリを開発しているのですが、NSTimerを使ってテキストを一文字ずつ表示させる処理を実装しています。しかし、表示が完全に終わる前に別の処理が実行されてしまいます。この問題について、NSTimerの処理との同期の取り方を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

NSNotification を使っては、どうでしょうか。

Daile
質問者

お礼

ありがとうございます! 無事に処理を実現できました。 まだまだ勉強不足ですが、理解を深めて、 riding_heartさんのように、皆さんのお役に立てるように頑張ります。 感謝!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • objective c 1文字ずつ表示

    調べてみたところ、NSTimerと言う関数を見つけて 0.05fずつ反応する媒体が出来ました。 -(id)init{ timer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(timetime:) userInfo:nil repeats:YES ]; return self; } -(void)timetime:(NSTimer *)time{i++; NSLog(@"この機能を利用してノベル風テキスト出力をしたいです"); } コレを利用してノベルゲーム風に1文字ずつ表示したいのですが、 何か方法はありませんか?

  • Objective-C,NSTimerを使って1秒毎に10秒かかる処理

    Objective-C,NSTimerを使って1秒毎に10秒かかる処理を実行させる事ってできますか? 例えば、以下に書いたとすると、(行頭全角スペースです。) @interface testTimer : NSObject {  NSTimer *timer; } @end @implementation testTimer - (id) init { timer = [NSTimer scheduledTimerWithTimeInterval:1.0  target: self  selector:@selector(timeUpdate:)  userInfo:nil  repeats:YES]; } - (void) timeUpdate:(id)sender {  NSLog(@"%@",[NSDate date]);   [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:10.0]]; } @end 毎秒タイムスタンプは出力されませんでした。 以上、ご指導の程、よろしくお願いいたします。

  • Swiftについて教えてください

    タイマー処理をしようと以下のようにしたのですが、 Cannot invoke 'scheduledTimerWithTimeInterval' with an argument list of type '(Float, target: ViewController, selector: String, userInfo: nil, repeats: Bool)'というエラーがでます。 Floatの部分に直接、小数を記述するとエラーが消えるのですが、self.Intervalなど変数で指定できないのでしょうか? import UIKit class ViewController: UIViewController { // var Interval:Float = 1.0 // var timer = NSTimer() override func viewDidLoad() { super.viewDidLoad() //タイマー開始 self.start() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //スライドショーを開始する func start(){ //タイマー定義 self.timer = NSTimer.scheduledTimerWithTimeInterval(self.Interval, target: self, selector: "next:", userInfo: nil, repeats: true) } //次へ func next(timer:NSTimer){ println("次へ") } }

    • ベストアンサー
    • Swift
  • iPhoneアプリ とある質問です。

    NSTimerの中のUIViewアニメーションが動きません。 NSTimerの中のアラームは動いているので、NSTimerは動いていると思うのですが。。。 3週間、思いつく限り色々と試したり、参考書見たり、ネットで調べたりしたのですが、お手上げです。 ヒントでもかまいませんので、アドバイスを頂けたら幸いです。 まず状況としては、 h.ファイルで、アニメーションで動かしたい、IBOutlet UIButton *mを宣言してあります。 次に、UISwitchのON,OFFでNSTimerが起動します。 musicClock = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(test:) userInfo:nil repeats:YES]; そして、NSTimerの中で、以下のようにプログラムしてあります。 条件にあてはまれば、音楽とアニメーションが画面上で動くことを意図しています。 -(void)test:(NSTimer*)timer{ musicDate = [datePicker date]; NSTimeInterval t = [musicDate timeIntervalSinceNow]; NSLog(@"NSTimeInterval:%f",t); //アラームの処理 if (t <=0.0 && t > -600.0){ if (!musicAlarm.playing) //アニメーションの定義開始 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.4]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; int x = rand() % 320; int y = rand() % 480; m.center = CGPointMake(x, y); [musicAlarm play]; [UIView commitAnimations];

  • iPhone アプリ開発で困っています。

    iPhone のアプリ開発をXcodeで行っていますが、viewに作ったTextFieldに入力された文字列を、同じview上の別のTextFieldに表示するということが出来ません。 下のリストで、ビルドをするとエラーにはならないのですが、シミュレーターで文字列を入力すると、別のTextFieldに文字列が表示されることなくプログラムが停止してアイコン画面に戻ってしまいます。(コメントにしている部分は、きちんと動きます。) 基本的なことが分かっていないのだと思いますが、いろいろな参考書を調べたり、ネットで検索しても分からないので、よろしくお願いします。 (myOutlet1 と myOutlet2 を、それぞれのTextFieldに接続しています。また、myAction1 をボタンにタッチアップインサイドで接続しています。) @implementation rensyuuViewController - (IBAction)myAction1:(id)sender { NSString *str = [myOutlet1 stringValue]; [myOutlet2 setText:[NSString stringWithFormat:@"%@",str]]; /* int a = [[myOutlet1 text] intValue]; a = a * 3; [myOutlet2 setText:[NSString stringWithFormat:@"%d",a]]; */ } @end

  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

    • 締切済み
    • Mac
  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa

  • swiftでストップウォッチに計算機能を追加

    swiftでストップウォッチアプリを作りました。 そのアプリに以下の機能を追加しようと思います。 一つの作業が完了するまでの時間(秒)を計測した上で、 その時間をもとに1時間あたりではいくつの作業が完了するのか、 計算して画面に表示させる機能。 (計算式:3600 / 計測した秒数 = 1時間あたりの作業数) どのように書けば、上記のような機能を追加できるでしょうか? 現状のソースコードは以下のようになります。 import UIKit class ViewController: UIViewController { @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var startButton: UIButton! @IBOutlet weak var stopButton: UIButton! @IBOutlet weak var resetButton: UIButton! @IBOutlet weak var page: UILabel! var startTime: NSTimeInterval? = nil var timer: NSTimer? var elapsedTime: Double = 0.0 override func viewDidLoad() { super.viewDidLoad() setButtonEnabled(true, stop: false, reset: false) // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func setButtonEnabled(start:Bool, stop:Bool, reset:Bool) { self.startButton.enabled = start self.stopButton.enabled = stop self.resetButton.enabled = reset } func update() { if let t = self.startTime { let time: Double = NSDate.timeIntervalSinceReferenceDate() - t + self.elapsedTime let sec: Int = Int(time) let msec: Int = Int((time - Double(sec)) * 100.0) self.timerLabel.text = NSString(format: "%02d:%02d:%02d", sec/60, sec%60, msec) as String } } @IBAction func startTimer(sender: AnyObject) { setButtonEnabled(false, stop: true, reset: false) self.startTime = NSDate.timeIntervalSinceReferenceDate() // 2001/1/1 0:0:0 self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true) } @IBAction func stopTimer(sender: AnyObject) { setButtonEnabled(true, stop: false, reset: true) if let t = self.startTime { self.elapsedTime += NSDate.timeIntervalSinceReferenceDate() - t self.timer?.invalidate() self.timer = nil } } @IBAction func resetTimer(sender: AnyObject) { setButtonEnabled(true, stop: false, reset: false) self.elapsedTime = 0.0 self.startTime = nil self.timerLabel.text = "00:00:00" } }

    • ベストアンサー
    • Swift
  • iphoneでTableViewに動的追加できない

    UITableViewでWebから取得した情報を表示したく、非同期にCellを追加する テストアプリを書いていたのですが、わからない点がいくつかあります。 以下は非同期追加のテストコードで、実行するとリストに"foo"が一件だけ表示され 2秒おきにリストに”bar”が追加されます。 @interface AddRowTableViewController : UITableViewController { NSMutableArray *dataSouce; } -(void)onTimer:(NSTimer*)timer; @end @implementation AddRowTableViewController - (void)viewDidLoad { // 初期値は空欄 dataSouce = [[NSMutableArray alloc] init]; // (1) // 初期値としてfooを持つ //dataSouce = [[NSMutableArray alloc] initWithObjects:@"foo", nil]; // (1)' // 2秒ごとにbarを追加するためにインターバルタイマをセット [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(onTimer:) userInfo:nil repeats:YES]; } // 2秒ごとに挿入のために呼ばれる -(void)onTimer:(NSTimer*)timer { // barを追加 [dataSouce addObject:@"bar"]; [self.tableView beginUpdates]; NSIndexPath* path = [NSIndexPath indexPathForRow:0 inSection:0]; // (2) [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop]; [self.tableView endUpdates]; // (3) [self.tableView reloadData]; // (4) } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [dataSouce count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *id = @"default-cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:id]; if(!cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:id]; [cell autorelease]; } cell.textLabel.text = [dataSouce objectAtIndex:indexPath.row]; return cell; } #if 0 // (5) - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if([dataSouce count] > 0) return 1; else return 0; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { // テストなので、聞かれたらTitleと答えておく return @"title"; } #endif @end このプログラムは一応動作するのですが、少し変えると期待通りに動作しません。 疑問1 コード中の(1)をコメントアウト及び(1)’をコメントインした状態で、初期値として "foo"が画面に表示された状態からスタートするようになりますが、このとき (2)で先頭に挿入するように記載していますが、実際には2行目に挿入されます。 foo bar bar 例えば4秒後にはこんな感じに並びます。なぜでしょうか? 疑問2 (4)のコードを書くと挿入時にアニメーションしません。(4)のコードを書かないとbarではなく fooが追加されたように見えます。スクロールしてフレームアウト/インなどの動作が あるとセルがリロードされ正しくbarになります。 挿入アニメーションを有効にしつつ最新データを参照させるにはどうしたらよいのでしょうか? 疑問3 (5)を#if 1とすることでセクションが表示されるようになりますが、このときに 初期値として何かあれば追加できますが、初期状態が空欄の場合に追加できず (3)のコードがSIGABRTを発行してしまいます((1)だとNG、(1)’だと通る)。 空欄のセクション付きリストにCellを挿入するにはどうしたらよいでしょうか? 経験が浅く、非常識なコードになっているのではないかと思いますが、 どうにも自力ではこれ以上進めなくなってしまいました。 上記1~3の一つでもいいので、なにかヒントをいただけないでしょうか? 未検証のカンによるアドバイスも歓迎です、こちらで検証させて頂きます。 どうかよろしくお願い致します。