2016-11-23 41 views
3

現在我有3個Viewcontrollers這樣的:從一個視圖控制器到另一個ViewController中去,並更新

HomeViewcontroller = VC1. 
Viewcontroller2 = VC2 --> has a table view with cells on it. 
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete. 

我使用NavigationController Viewcontrollers之間,獲得不錯的「後退」按鈕:)

比方說我在VC1中,我按了一個按鈕,然後我去了VC2。 現在讓我們說我有4個單元格。 我按下單元格號碼2,然後轉到VC3,在那裏我可以編輯單元格中的內容,甚至刪除它。 這是所有工作正常(測試它)。

比方說,我想刪除該單元格。我在VC3上有一個按鈕,我使用它並刪除了單元格(這已經過測試,並且工作正常)。

現在我做到這一點時,我推入VC2又是這樣的:

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2! 
self.navigationController?.pushViewController(viewController!, animated: true) 

的問題是,當我這樣做,我去VC2,但我不重裝我的tableView有它應該(擦除細胞它仍然存在)。

爲了解決這個問題我嘗試添加在VC2一些代碼,在viewDidLoad中:

self.tableView.reloadData() 

現在我設法做到這一點的工作。我的意思是當我從VC3中刪除一個單元格時,我被推送到VC​​2,而單元格不在那裏。然而,如果我按下後退按鈕,它會將我帶到之前刪除的單元格,,,如果單元格不再存在,我不希望它將我帶到那裏。我想讓它帶我去VC1(家)。

我該如何做這項工作?

也許我應該以另一種方式做到這一點,而不是像這樣推?

回答

2

實際上你做錯了,當VC3進行刪除/編輯操作,你想回來就VC2,爲什麼你在做pushViewController,你必須申請popViewController

您必須應用self.navigationController?.popViewController(animated: true)從VC3回到VC2。

刪除

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2! 
self.navigationController?.pushViewController(viewController!, animated: true) 

添加

self.navigationController?.popViewController(animated: true) 

另外

置於表視圖reloadData()方法viewWillAppear。如下面的代碼。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    self.tableView.reloadData() 

} 

閱讀有關UINavigationController的一些參考資料。

https://developer.apple.com/reference/uikit/uinavigationcontroller

+0

和我的回答一樣。 – vacawama

+0

試過了。你是對的。而已。非常感謝。我會檢查它,並確定地閱讀 –

+0

偉大的,保持愉快的編碼。 – Hasya

2

將您的self.tableView.reloadData()置於viewWillAppear的覆蓋範圍內。在創建viewController後僅調用一次viewDidLoad,但每當它出現在屏幕上時調用viewWillAppear

此外,請勿使用推送從VC3返回到VC2。你應該彈出當前的viewController。

self.navigationController?.popViewController(animated: true) 
+0

很好的答案。和我的答案一樣。 +1兄弟。你對'popViewController'很好的觀察。 – Hasya

+0

試過了。你是對的。而已。非常感謝 –

1

而是從ViewController3再次推ViewController2,你需要創建一個代表和實現ViewController2內的代表現在viewController3創建委託的實例並設置當您從ViewController2移動到該委託ViewController3。現在,當您更新或刪除ViewController2的數據時,只需使用該委託從ViewController2調用方法,並在該方法內更新您的數據源並重新加載tableView

+0

這就是謝謝:) –

1

N.,

通常,當不同視圖控制器被嵌入在導航控制器,你推堆棧和回去你從棧中彈出。據我瞭解你的故事似乎你只是推動堆棧上的新視圖控制器。

您的第一個視圖控制器是VC1。您按下一個按鈕,然後將新視圖控制器推入堆棧VC2。導航控制器現在在堆棧VC1和VC2上有2個視圖控制器。然後,您在VC2的表格視圖中選擇一個單元格,並將它帶到VC3。

導航控制器現在在堆棧VC1,VC2和VC3上擁有3個視圖控制器。現在,您刪除一個單元格,然後在堆棧中推送一個新的視圖控制器,這又是一個VC2,但是是一個新的。導航控制器現在在堆棧VC1,VC2,VC3和另一個VC2實例上有四個視圖控制器。

我假設你有一個模型對象,其中包含VC2和VC3的表視圖中的數據。刪除單元格時,應刪除模型對象中的單元格,而不是在堆棧上推新的VC2,但關閉VC3。您可以使用VC2中的@IBAction將其刪除按鈕連接到此。然後它從堆棧中彈出VC3,然後在IBAction方法中將其返回到VC2,並已將其鏈接到刪除按鈕。然後導航控制器再次在堆棧上有兩個視圖控制器,VC1和VC2。

在這種IBAction爲方法,你可以重新加載表視圖,表視圖將調用數據源方法

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

這種方法會看你的模型對象,並沒有發現刪除的數據,你的細胞已經一去不復返了。

當您按下後退按鈕時,導航控制器將VC2從堆棧中推出,並且只剩下一個視圖控制器VC1。你會回到你的頁面。

希望這會有所幫助。

+0

感謝您向我解釋。我可以看到什麼是錯的。再次感謝 –

相關問題