2012-06-10 87 views
1

我有一個'創建新事件'頁面,用戶可以點擊UINavigationController上的'Back'或'Done'來創建一個新事件。之後都會導致相同的頁面。如何判斷用戶是否按下或完成?

如果我的用戶按下「完成」,保存在控制器中的當前對象將通過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仍然被調用。有人知道爲什麼

====== 這是如何設置新的。

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

您是否已將完成和返回按鈕的單獨回調函數關聯? – Saurabh

回答

0

顯然,[event isUpdated]isNew始終具有相同的價值,無論用戶採取什麼樣的行動。在done:中設置一個標誌(例如伊維爾),並檢查viewWillDisappear:中的標誌值。

+0

實際上isNew由init函數設置,而不是事件isUpdated。 – disappearedng

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] 
} 

現在所有執行該委託視圖控制器將獲得通知,您應該創建廣管局兩個代表席的方法之一ck按鈕,另一個用於完成按鈕

//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 
} 
+0

如何在UINavigationController上按下BackButtonPressed? – disappearedng

+0

把這行代碼放在後退按鈕目標** [委託backButtonPressed:發送者] **將告訴所有實現的按鈕被按下的類 – ahmad

+0

不,這不是我的意思。我的意思是什麼觸發backButtonPressed?您無法按住Ctrl鍵將UINavigationController的後退按鈕拖動到此方法的FYI。 – disappearedng

相關問題