2011-10-23 22 views
1

私は客観的なcで楽しいです。シンプルなプログラムとして、私は時計アプリケーションを書こうと思っていました。シンプルクロックアプリケーション:毎秒委譲またはコールバックを使用しますか?

基本的に、UITextFieldは現在の時刻を表示し、毎秒更新する必要があります。

私の最初の考えは、委譲を使用して、 'Value Changed'イベントが発生したときにUITextFieldがクラスをコールバックさせることでした。初期値の変更を(例えば、アプリケーションの起動時に時間を設定するなどして) 'ブートストラップ'することで、後で「値変更」イベントを継続してトリガーすることができると考えました(UITextFieldは自動的に変更され、デリゲートメソッドをトリガーします)。私は多くのことを試みましたが、これは決して働きませんでした。私は、委任されたメソッドが呼び出されることを期待して、UITextFieldを任意のテキスト値に設定するボタンを作成しようとしました(UITextFieldを起動時に設定するのではなく)。私のコードが正しいことを証明するために、「Touch Down」のような他のアクションを使用すると、時間が更新されました。例えば、UITextFieldのクリックごとに時間が得られます。

私は結局、[self performSelector ...]を使用して毎秒コールバックを使用できることを知り、それが機能しました。

「値の変更」アクションを使用している私の委任がうまくいかなかった根本的な理由はありますか?

答えて

1

ユーザーイベントに応答して値変更されたイベントのみが発生します。すなわち、textField.text = "something"を設定しても、それは発生しません。

それはあなたのアプリケーションで無限ループに陥るようにしていたので、うまくいかなかったのです。ボックスにテキストを設定したときに 'value changed'イベントが実際に発生した場合、プログラムはデリゲートに再度尋ね、テキストを再度設定します。デリゲートにもう一度質問します。これは、無限ループと呼ばれ、プログラムの実行がこのループを終了する方法がないため、プログラムがハングしてクラッシュするという影響があります。

はとにかく、あなたが言っている何をするためには、次の2つのオプション

  1. を持っているあなたは、あなたの時間更新方法秒ごとに呼び出すためにNSTimerオブジェクトを設定することができます。それはかなり簡単です、the documentationをチェックしてください。

  2. performSelector:withObject:afterDelay:。あなたはすでにこの1つのハングアップを持っているかもしれないように聞こえる。それはNSTimerを使うほどきれいではありませんが、それは仕事をするでしょう。

+1

これは意味があります。私にとっては無限ループはAppleの本拠地でした;) – azog

+2

技術的には無限ループではありませんが、私は信じる無限の再帰です。これはスタックのオーバーフローを引き起こします。 – morningstar

関連する問題