AddEditEmojiTableViewController

AddEditEmojiTableViewController

我开始在这份Apple指南的帮助下学习Swift:https://itunes.apple.com/it/book/app-development-with-swift/id1219117996

现在,我陷入了一个小问题,我想了解如何解决,但是从指南中来看并不太清楚。

这是情况

ios - Swift:将数据传递到静态表 View-LMLPHP

这是一个简单的应用程序,显示带有说明的表情符号列表。点击表情符号单元格,它应该打开静态表格视图并显示表情符号的信息。

结果


从指南

“您需要将Emoji对象从EmojiTableViewController传递给
轻触单元格时的静态表视图控制器。开始于
创建一个新文件,并定义一个UITableViewController子类
名为“AddEditEmojiTableViewViewController”。记得删除或
注释掉文件中的任何表视图数据源方法。在
Main.storyboard,将静态表视图的“自定义类”设置为
“AddEditEmojiTableViewController”。将属性添加到
AddEditEmojiTableViewController类称为emoji,其类型为
表情符号在...的prepare(for segue :)方法中
EmojiTableViewController,您将检查标识符,向下转换
目标视图控制器,访问要传递的对象,然后分配
属性:”

AddEditEmojiTableViewController 文件

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直接从EmojiTableViewController连接到AddEditEmojiTableViewController,则它将按预期工作。

在第一个示例中,segue.destinationUINavigationController, which has nothing to do with the AddEditEmojiTableViewController class. So force casting segue。目的地to AddEditEmojiTableViewController`总是会失败。

在第二个代码段中,代码的目标有效,因为它遵循视图控制器树:test1是导航控制器,其根vc是test2,它是AddEditEmojiTableViewController

10-06 11:32