我有一個Swift3中的應用程序,它由2個不同的顯示類資產細節的UITableView組成。兩個表中的數據內容相同/相似(有一些過濾器),表示方式不同。因此,這個UIViewTables中的一個顯示了每個資產的註釋,另一個更關注於狀態。Swift3和Segue:兩個不同的UITableViewController指向一個UIView
如果用戶單擊一個表格單元格,兩個UITableViews都會打開相同的UIView以獲取完整的詳細信息,因爲兩個表格在最後表示相同的數據。
我嵌入了一個UINavigationControl併爲每個TableCell創建了一個segue。如果我點擊單元格,將打開正確的詳細信息屏幕。
但是,如果我將它保存下來,即使我從第二個表開始,它總能讓我回到第一個表。
有人可以給我一個提示嗎?
這是我在點擊保存按鈕時調用的DetailViewController準備方法。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
print(segue.identifier)
// Configure the destination view controller only when the save button is pressed.
guard let button = sender as? UIBarButtonItem, button === btnSave else
{
//os_log("The save button was not pressed, cancelling", log: OSLog.default, type: .debug)
return
}
asset?.name = tfDeviceName.text ?? ""
//here comes some other stored asset information...
}
這是我第一次的UITableViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "")
{
case "AddItem":
os_log("Adding a new asset.", log: OSLog.default, type: .debug)
case "ShowDetails":
guard let assetDetailViewController = segue.destination as? DetailViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let selectedAssetCell = sender as? AssetTableViewCell else {
fatalError("Unexpected sender: \(String(describing: sender))")
}
guard let indexPath = tableView.indexPath(for: selectedAssetCell) else {
fatalError("The selected cell is not being displayed by the table")
}
selectedIndex = indexPath.row
let selectedAsset = assets[indexPath.row]
assetDetailViewController.asset = selectedAsset
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
editMode = true
}
這是我第二次的UITableViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "AddItem":
os_log("Adding a new asset.", log: OSLog.default, type: .debug)
case "ShowTask":
guard let taskDetailViewController = segue.destination as? DetailViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let selectedAssetCell = sender as? TaskTableViewCell else {
fatalError("Unexpected sender: \(String(describing: sender))")
}
guard let indexPath = tableView.indexPath(for: selectedAssetCell) else {
fatalError("The selected cell is not being displayed by the table")
}
let selectedAsset = assets[indexPath.row]
taskDetailViewController.asset = selectedAsset
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
}
謝謝! BR 斯特凡
與Solution編輯:
THX到鄧肯的提示,我發現我的問題。展開操作通過crtl單擊並將其拖至退出事件,然後選擇展開方法,以附加到界面構建器中的保存按鈕。重要的是:您只能選擇一種方法,而不能選擇課程。該類由管理導航的系統自動選擇,但兩種方法(顯然)都必須具有相同的展開名稱。我犯了一個錯誤,使第二個UITableView中的展開方法稍有不同,然後系統在正確的UITableView中找不到該方法,並且跳到具有正確方法的UITableView,即使這個類不是原始的segue
我使用反向這些來自蘋果的官方教程,區別在於我有2個表格,而不僅僅是一個(https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementNavigation.html#//apple_ref/doc/ UID/TP40015214-CH16-SW1)。 如我的剪切圖所示,我的保存按鈕在我的DetailViewController中調用prepare,將更改存儲在我的資源中,然後跳回(到錯誤的表)。在UITableViews中有展開方法可以對展開作出反應。有沒有辦法設置正確的賽格?正如在教程中我從不稱呼解僱,只有當「取消」 – user3354754
「如我的剪切(原文如此),我的安全按鈕調用準備......」您沒有發佈您的DetailViewController的保存按鈕操作的任何代碼。這是我們需要看到的代碼。你說:「...我的保存按鈕在我的DetailViewController中調用準備,將更改存儲在我的資產中,然後跳回(到錯誤的表)。」你是什麼意思「電話準備」? 「跳回」是什麼意思?顯示該代碼。 –
好吧,我發現我的錯誤,我控制 - 從畫布上的故事板拖動我的保存按鈕到退出事件,並選擇了展開一個tableview一個segne。我想假設它可以在代碼中動態地更改正確表的被調用的unwind方法:) – user3354754