1

s の使い方を学ぼうとしてNSTimerいて、次のことを考えました: スイッチを作成します。アプリが開始されるとタイマーが開始され、1 秒ごとにスイッチの状態を変更する関数が呼び出されます。

これが私がこれまでにしたことです:

ヘッダー ファイル ViewControl.h でタイマーとスイッチの両方を宣言しました。

//Timer 
{NSTimer *timer;}
@property (weak, nonatomic) IBOutlet UISwitch *zeSwitch;

次に、ViewControl.m ファイルで次のように定義しました。

- (IBAction)zeSwitch:(id)sender {
    UISwitch *zeSwitchSatus = (UISwitch *) sender;
    BOOL yn = zeSwitchSatus.isOn;
    [zeSwitch setOn:yn animated:YES];

}    

- (void)viewDidLoad
{

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self 
    selector:@selector(zeSwitch) userInfo:nil repeats:YES];


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

したがって、コードを実行すると、オンまたはオフのスイッチが表示されることを願っていました。次に、私が干渉することなく、時間の経過とともにステータスが自動的に変化するのを確認します。

画像!

しかし、それはうまくいきませんでした!最初に上の画像を取得します。何も変わりません。その後、スイッチを押すとクラッシュします。(しかし、私の考えでは、まったく触れないでください。)

何か案は?

4

2 に答える 2

4

あなたはかなり近いです。ここにはいくつか問題があります。まず、タイマーに指定するメソッドに名前を付けzeSwitch:ます。コロンは重要です。したがって、次のようにタイマーを作成する必要があります。

timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                         target:self 
                                       selector:@selector(zeSwitch:) 
                                       userInfo:nil             //^ Note colon!
                                        repeats:YES];

プロパティに名前を付けているため、コロンなしで名前を付けたメソッドzeSwitchは、実際にはスイッチのアクセサー メソッドですzeSwitch。これを明確にするために、タイマーのアクションメソッドの名前を本当に変更する必要があります。現在、タイマーはスイッチのアクセサ メソッドを毎秒呼び出していますが、実際には何もしていません。

次に、タイマーは自分自身を呼び出したメソッドに渡します。のsender引数はzeSwitch:、スイッチではなくタイマーになります。このメソッドが実際にタイマーを介して呼び出されていた場合isOn、タイマーに送信しているためクラッシュが発生し、それに応答しません。

スイッチへのアウトレットがあるので、そのアウトレットを介して参照できます。

- (void)flipSwitch: (NSTimer *)tim
{
    BOOL switchIsOn = [[self zeSwitch] isOn];

このメソッドの名前と型を修正したことに注意してください。これを反映するように、タイマーの作成も変更する必要があります@selector(flipSwitch:)

3 番目に、スイッチを反転させたいので、現在の状態の反対に設定する必要があります。次の行は次のようにする必要があります。

    [[self zeSwitch] setOn:!switchIsOn animated:YES];

!演算子は、それが接続されている を否定し、BOOLに変換したり、その逆にYES変換したりします。NO

于 2012-05-28T00:39:02.683 に答える
3

1) 1 つのパラメーターを取るセレクターを指定する場合、名前の後にコロンが必要なので、@selector(zeSwitch:).

2)タイマーによってトリガーされるセレクターは、スイッチではなくパラメーターとしてタイマーを取得するため、- (IBAction)zeSwitch:(NSTimer *)timer.

于 2012-05-28T00:37:13.553 に答える