1

ユーザーが UINavigationController の [戻る] または [完了] をクリックして新しいイベントを作成できる [新しいイベントの作成] ページがあります。どちらもその後同じページにつながります。

ユーザーが「完了」を押すと、コントローラーに保持されている現在のオブジェクトが saveChanges によって保存されます。ただし、ユーザーが編集中でもこれを放棄することにした場合は、このイベントの存続期間中にこのユーザーによって生成された静的ファイルをクリーンアップする必要があります。

私の唯一の問題は、ユーザーと「完了」または「キャンセル」を区別する方法がないことです。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // If user has left this page by either pressing 'Done' or 'Cancel'
    if (![[self.navigationController viewControllers] containsObject:self]) {
        // If this event is NOT saved aka 'Cancel' is pressed.
        if (![event isUpdated]) {
            // It is important that we only delete videos associated when isNew.
            if (isNew) { 
                NSURL *url = [self getMovieUrl:event.uuid];
                [self deleteMovieByUrlIfExists:url];
            }
            self.event = nil;
        }
    }
}

- (IBAction)done:(id)sender {
    [self.view endEditing:YES];
    if (isNew) { 
        event.eventType = eventTypeInput.text;
        event.targetId= [NSNumber numberWithInt:[targetIdInput.text intValue]];
        event.game = game;

        BOOL success = [[DataStore singletonInstance] saveChanges];
        if(success) {
            NSLog(@"Success: Event %@ saved. hasVideo:%d", event.uuid, [event.hasVideo intValue]);
            // TODO [newEvent upload];
            // Also upload the video if possible. 
        } 
    }
    [self.navigationController popViewControllerAnimated:YES];
}

上記のコードは機能しません。ユーザーが「完了」を押すと、deleteMovieByUrlIfExists:url が引き続き呼び出されます。誰でも理由を知っていますか?

====== これが isNew の設定方法です。

- (void)initWithEvent:(id)sender event:(Event *)ev { 
    isNew = !ev;
    if (isNew) { 
        event = [[DataStore singletonInstance] createEvent];        
    } else { 
        event = ev;
    }
}
4

2 に答える 2

0

ビューコントローラーのデリゲートを作成する必要があります。デリゲートは、アクションに基づいてデータを他のビューコントローラーに転送するために使用されます。デリゲートの詳細を読むことを強くお勧めしますが、簡単な手順を次に示します。

@protocol viewControllerDelegate <NSObject>
@required
//define the delegate methods
-(void)backButtonPressed;
-(void)doneButtonPressed:(id)sender

@end

@interface ViewContorller : xxx
{
id <viewControllerDelegate> delegate;
}

アクション メソッドでデータの処理が終了したら、次のコード行を記述します。

 - (IBAction)done:(id)sender {
 [delegate backButtonPressed:sender]
 }

これで、このデリゲートを実装するすべてのビュー コントローラーがこれを通知されます。[戻る] ボタン用と [完了] ボタン用の 2 つのデリゲート メソッドを作成する必要があります。

//in the parent view controller .h file add the delegate to the definition
 @interface MyViewController: UIViewController <viewControllerDelegate>

//in the .m file implement the delegate methods
-(void)backButtonPressed:(id)sender
{
  //this method will get called when the back button is pressed
}
 -(void)doneButtonPressed:(id)sender
 {
  //this method will get called when the done button is pressed
 }
于 2012-06-10T13:54:18.493 に答える
0

どうやら、ユーザーがどのようなアクションを実行しても、常に同じ値になります[event isUpdated]isNewでフラグ ( BOOLivar など) を設定し、 でフラグdone:の値を確認しますviewWillDisappear:

于 2012-06-10T10:24:29.737 に答える