2010-09-19 70 views
53

我有頂級UIViewController,其中包含UITableView。頂級UIViewController實例化NavigationController,並將另一個UIViewController推到NavigationController上。 I.E.我們推入了新的第二種觀點。第二個視圖在左上角具有通常的「返回」按鈕,以允許您導航回頂層視圖。導航回來時重新加載UITableView?

從第二個視圖導航回頂層視圖時,是否可以使用第二個視圖中生成的數據在頂層視圖中重繪UITableView,在頂層調用cellForRowAtIndexPath,如果是這樣,如何做到這一點?

回答

105

所有你需要做的就是這個(在你的UIViewController中有一個UITableView)。您現在不必擔心單元級的情況。

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; // to reload selected cell 
} 

只需添加上面的代碼到你的控制器,你會看到,當你從你的第二個觀點回到正確的事情發生了。對reloadData的調用告訴表視圖,它需要從模型中刷新它的單元格,其他所有內容都很好地遵循。

+1

我用這個方法,卻不得不因爲他們在那裏初始加載兩個發射的代碼從我didViewLoad移動到viewWillAppear中。對我而言,這是一個更大的問題,因爲我需要從Web服務下載新的項目詳細信息 – PowerMan2015 2015-11-28 16:46:46

5

您可以實現UINavigationControllerDelegate的方法,並在彈出視圖控制器時創建刷新邏輯。

另一種方法可以在你的表視圖控制器上實現一些viewWillAppear上的邏輯,根據彈出視圖控制器的數據進行刷新。

如果您需要將數據從第二個視圖控制器發送到第一個視圖控制器,請記住您的第二個視圖控制器「不」知道前一個視圖控制器的存在。它應該是透明的。您應該實現一些協議以使第二個視圖控制器將數據發送到第一個視圖控制器。這將是這個問題的第三個選擇,因爲你的第一個視圖控制器將是委託,第二個視圖控制器將發送信息給委託,你可以準備你的表視圖(第一個視圖控制器)重新加載,基於收到數據。

10

如果你只是想重裝選擇該小區,覆蓋viewWillAppear:UITableViewController定製子類,像這樣:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; 
    [super viewWillAppear:animated]; // clears selection 
    if (selectedRowIndexPath) { 
     [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    } 
} 

注意:假設你已經離開clearsSelectionOnViewWillAppear設置爲YES(默認值),在調用super之前,您必須獲得所選行的索引路徑,這將清除選擇。

此外,只需撥打[self.tablView reloadData]solution of @ZoranSimic是可以接受的,因爲它代碼少,效率高。最後,也許讓表格視圖的單元格與它們所代表的模型對象保持同步的最佳方法是使用NSFetchedResultsController並使用鍵值觀察(KVO)和/或NSNotification通知您的表格視圖控制器何時建模對象已更改,以便它可以重新加載相應的單元格。表格視圖控制器可以開始觀察對viewDidLoad中模型對象的更改,並在dealloc(以及您的manually unload self.view任意位置)結束觀察。

6

在這裏除了斯威夫特代碼answer of Zoran Simic

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 
+0

當您想從'viewWillAppear()'重新加載數據時,請小心不要從viewDidLoad()中獲取數據。 – 2017-03-07 06:36:04

1

也許現在可以提供幫助。

對於斯威夫特2+

在您的viewDidAppear方法:

如果你想重新加載所有表:

tableView.reloadData() 

如果你只想要細胞選擇重新加載。

let index = tableView.indexPathForSelectedRow 
if (index != nil){ 
    self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) 
} 
2

viewWillAppear每當視圖出現時都會被調用,包括第一次。 這裏是我重新加載,只有當你導航回到

我創造我的ViewController.h file一個變量來檢查,這是我第一次去這個ViewController或當我向後導航

@property (nonatomic) BOOL isViewExist; 
視圖解決方案

後,在viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    if(!self.isViewExist){ 
     self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything 
    }else{ 
     [self.tableView reloadData]; // to reload the tableview data 
     // or your can refresh anything in your ViewController as you want 
    } 
} 

希望這有助於

-1

更新了斯威夫特3

let index = tableView.indexPathForSelectedRow 
    if (index != nil){ 
     self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) 
    } 
+0

_in - 覆蓋func viewDidLoad()或??? _ - 代表無法評論的用戶發表評論 – Tushar 2016-12-01 03:21:03