簡體   English   中英

Swift:將數據傳遞給靜態表視圖

[英]Swift: Pass data to static table view

我開始在 Apple 指南的幫助下學習 Swift: https : //itunes.apple.com/it/book/app-development-with-swift/id1219117996

現在我被困在一個我想了解如何解決的小問題上,但是從指南中它不是很清楚。

這是情況

在此處輸入圖片說明

這是一個簡單的應用程序,顯示帶有描述的表情符號列表。 點擊 emoji-cell 應該打開靜態表格視圖並顯示 emoji 的信息。

結果

從指南

“當單元格被點擊時,你需要將 Emoji 對象從 EmojiTableViewController 傳遞到靜態表視圖控制器。 首先創建一個新文件,並定義一個名為“AddEditEmojiTableViewController”的 UITableViewController 子類。 請記住刪除或注釋掉文件中的任何表視圖數據源方法。 在 Main.storyboard 中,將靜態表視圖的“自定義類”設置為“AddEditEmojiTableViewController”。 向 AddEditEmojiTableViewController 類添加一個名為 emoji 且類型為 Emoji 的屬性。 在 EmojiTableViewController 的 prepare(for segue:) 方法中,您將檢查標識符,向下轉換目標視圖控制器,訪問要傳遞的對象,然后分配屬性:”

添加EditEmojiTableViewController文件

import UIKit

class AddEditEmojiTableTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let emoji = emoji{
            symbolTextfield.text = emoji.symbol
            nameTextfield.text = emoji.name
            descriptionTextfield.text = emoji.description
            usageDescription.text = emoji.usage
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    var emoji: Emoji! = nil

    @IBOutlet weak var symbolTextfield: UITextField!
    @IBOutlet weak var nameTextfield: UITextField!
    @IBOutlet weak var descriptionTextfield: UITextField!
    @IBOutlet weak var usageDescription: UITextField!

}

EmojiTableViewController文件的准備功能,如指南中所述。 (EditEmoji 是從單元格到靜態表格視圖的轉場)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "EditEmoji" {
        let indexPath = tableView.indexPathForSelectedRow!
        let emoji = emojis[indexPath.row]
        let addEditEmojiTableViewController = segue.destination
        as! AddEditEmojiTableViewController
        addEditEmojiTableViewController.emoji = emoji
    }
}

以這種方式保持准備功能,當我點擊一個單元格時,我有這個錯誤崩潰

Could not cast value of type 'UINavigationController' .. to 'Emoji.AddEditEmojiTableTableViewController' ....
... Could not cast value of type 'UINavigationController' ... to 'Emoji.AddEditEmojiTableTableViewController' ...

因此,查看stackoverflow,我以這種方式修改了該函數,現在它可以工作了。

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "EditEmoji"{
        let indexPath = tableView.indexPathForSelectedRow!
        let emoji = emojis[indexPath.row]
        let test1 = segue.destination as! UINavigationController
        let test2 = test1.topViewController as! AddEditEmojiTableTableViewController
        test2.emoji = emoji
    }
 }

所以我的問題是:指南錯了嗎? 該指南是否未使用最新的 Swift 版本進行更新?

該指南需要更新,您不應該將AddEditEmojiTableViewController放在導航控制器中。 如果您將 segue 直接從EmojiTableViewControllerAddEditEmojiTableViewController ,它將按預期工作。

在您的第一個示例中, segue.destination是一個UINavigationController, which has nothing to do with the AddEditEmojiTableViewController class. So force casting UINavigationController, which has nothing to do with the class. So force casting class. So force casting segue.destination class. So force casting to AddEditEmojiTableViewController` 將始終失敗。

在你的代碼目標的第二個片段中,它可以工作,因為遵循視圖控制器樹: test1是導航控制器,它的根 vc 是test2 ,它是AddEditEmojiTableViewController

如果 IB 中的 desintation VC 插入到 navigationController 中,則無需查看指南,那么它是不正確的,您可以使用

let addEditEmojiTableViewController = segue.destination as! UINavigationController

但如果你編輯它,反之亦然

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM