1

コードを一度に1つずつ実行する方法。つまり、一貫して実行したいコードがあります。例:

- (IBAction)downloadPressed:(id)sender {
    //1
    CGRect frameDelete = deleteButton.frame;
    frameDelete.origin.y = (deleteButton.frame.origin.y-50);
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration: 0.5];
    deleteButton.frame = frameDelete;
    [UIView commitAnimations];
    [progressLine setProgress:0];

    //2 Wait until the code is executed above, and then run the code below      
    NSURL *fileURL = [NSURL URLWithString:@"http://intercreate.ru/all.zip"];
    [self downloadDataAtURL:fileURL];

    //3 Wait until the code is executed above, and then run the code below
    CGRect frameDelete1 = deleteButton.frame;
    frameDelete1.origin.y = (deleteButton.frame.origin.y+50);
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration: 0.5];
    deleteButton.frame = frameDelete1;  

}

つまり、コードを3つの部分に分割したいと思います。

  1. 最初にノブを上に動かします
  2. ファイルをダウンロードする
  3. フォールバックボタン。

どうすればよいですか?

4

3 に答える 3

1

このようなことを行う従来の方法は、プロトコル/デリゲートデザインパターンです。ただし、これはブロックのために廃止されました。これらはこれを達成するための最も簡単な方法です。たとえば、優れたMBProgressHUDに組み込まれています。あなたはこれであなたが望むことを達成することができます:

- (IBAction)downloadPressed:(id)sender {
CGRect frameDelete = deleteButton.frame;
frameDelete.origin.y = (deleteButton.frame.origin.y-50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete;
[UIView commitAnimations];
[progressLine setProgress:0];

MBProgressHUD *aHud = [[MBProgressHUD alloc] initWithView:self.view];
[aHud showHudAnimated: NO whileExecutingBlock:^
 {
//2 Wait until the code is executed above, and then run the code below      
NSURL *fileURL = [NSURL URLWithString:@"http://intercreate.ru/all.zip"];
[self downloadDataAtURL:fileURL];
 } completionBlock: ^
  {
//3 Wait until the code is executed above, and then run the code below
CGRect frameDelete1 = deleteButton.frame;
frameDelete1.origin.y = (deleteButton.frame.origin.y+50);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5];
deleteButton.frame = frameDelete1;  
[UIView commitAnimations];

}]; }

進行状況HUDは、さらに多くのことを実行できます。たとえば、進行状況インジケーターを表示します:)

ブロックの使用法については、この投稿をチェックしてください:リンク

于 2012-12-16T11:48:35.037 に答える
1

前半は新しいブロックベースのアニメーションでダウンする可能性があり、アニメーションが完了したときに実行されるコードを提供できます。私が間違いなく通知を使用して行う2番目の部分は、ファイルのダウンロードが終了したときに通知を投稿できます。その後、コードの他の部分は、このイベントに任意の方法で応答し、GUIを変更し、ユーザーに通知し、ダウンロードするもののリスト。元のコードを変更することなく、この通知を聞くための新しいものを追加することもできます。

于 2012-12-16T11:50:08.090 に答える
0

beginAnimations commitAnimations古いスタイルの方法を使用しているようです。

新しいブロックベースのアニメーションメソッドに移行すると、完了ハンドラブロックを使用できるという利点が得られます。また、非同期URLダウンロードメソッドを使用する場合、APIは完了ブロックを追加する場所も提供します。

したがって、本質的に:

  1. ボタンを動かすためのブロックベースのアニメーションを作成する
  2. このアニメーションの完了ハンドラーで、非同期ダウンロードをトリガーします
  3. ダウンロードの完了ハンドラーで、ボタンを移動するアニメーションを起動します。

これらはすべて1つのブロックベースのメソッド(元のアニメーションブロック)に含まれているため、個々のアクションは次々に発生します。

于 2012-12-16T12:06:55.177 に答える