2009-07-13 58 views
1

我的應用程序出現問題。任何幫助將不勝感激。基本上它是從視圖A到視圖B,然後從視圖B回來。從其他視圖回來後從表視圖重新加載數據

在視圖A中,它具有從數據庫中加載的動態數據,並顯示在表視圖上。在這個頁面中,它也有編輯按鈕,不在導航欄上。當用戶選中編輯按鈕時,它會轉到顯示選取視圖的視圖B.用戶可以在這裏進行任何更改。一旦完成,用戶在導航欄上選中後退按鈕,它將更改保存到NSUserDefaults中,通過彈出視圖B返回到視圖A.

當回到視圖A時,它應該得到來自UIUserDefaults的新數據,它就這樣做了。我用NSLog打印出控制檯並顯示正確的數據。它也應該調用viewWillAppear:方法來獲取表視圖的新數據,但它沒有。它甚至沒有調用tableView:numberOfRowsInSection:方法。我在這個方法中放置了一條NSLog語句,但沒有在控制檯中打印出來。

結果,視圖A仍然有舊數據。在視圖A中獲取新數據的唯一方法是停止並啓動應用程序。

視圖A和視圖B都是UIViewController的子類,其中UITableViewDelegateUITableViewDataSource

這裏是我的視圖中的代碼:

- (void)viewWillAppear:(BOOL)animated { 
    NSLog(@"enter in Schedule2ViewController ..."); 

    // load in data from database, and store into NSArray object 

    //[self.theTableView reloadData]; 
    [self.theTableView setNeedsDisplay]; 
    //[self.theTableView setNeedsLayout]; 
} 

在這裏, 「theTableView」 是一個UITableView變量。我嘗試了所有三種「reloadData」,「setNeedsDisplay」和「setNeedsLayout」的情況,但似乎沒有奏效。

在視圖B中,這裏是對應導航欄上後退按鈕的方法。

- (void)viewDidLoad { 
    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(savePreference)]; 
    self.navigationItem.leftBarButtonItem = saveButton; 
    [saveButton release]; 
} 

- (IBAction) savePreference { 
    NSLog(@"save preference."); 

    // save data into the NSUSerDefaults 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

我在做正確的方法嗎?還是有什麼我錯過了?

回答

3

第一次加載視圖時,它會調用viewDidLoad方法。如果你創建一個堆棧,向下鑽取(從A到B),然後返回(B到A),viewDidLoad在A上不會再被調用。你可能想要嘗試的是將A傳遞給B(通過傳遞自己)並調用viewDidLoad方法獲取新數據,然後調用tableView上的reloadData方法來重新填充表視圖。

您可能想要嘗試的是將數據獲取和設置功能從viewDidLoad方法中提取出來,並將其放置在它自己的getData方法中。在getData方法結束時,您可以放置​​一個[self.tableView reloadData];來重置/重新填充表視圖。從B類,你可以調用[self getData],並儘量減少你在B類中的工作量。這將有助於提高代碼的可重用性,並且可以防止調用viewDidLoad方法的副作用。

1

你也可以使用viewDidAppear。每次出現屏幕時都會調用它。出於性能方面的原因,請設置一個標誌,以便您不必在viewDidLoad中爲第一個屏幕視圖重複使用viewDidAppear中的相同功能。

相關問題