Swift:将数据传递给静态表视图

问题描述 投票:1回答:2

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

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

情况就是这样

enter image description here

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

结果

从指南

“当点击一个单元格时,你需要将Emoji对象从EmojiTableViewController传递给静态表视图控制器。首先创建一个新文件,然后定义一个名为“AddEditEmojiTableViewController”的UITableViewController子类。请记住删除或注释掉文件中的任何表视图数据源方法。在Main.storyboard中,将静态表视图的“Custom Class”设置为“AddEditEmojiTableViewController”。使用类型为Emoji的AddEditEmojiTableViewController类添加一个名为emoji的属性。在EmojiTableViewController的prepare(for segue :)方法中,你将检查标识符,向下转换目标视图控制器,访问要传递的对象,然后分配属性:“

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文件的prepare函数,如指南中所述。 (EditEmoji是从单元格到静态表格视图的segue)

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版本更新?

ios swift
2个回答
1
投票

指南需要更新,你不应该把AddEditEmojiTableViewController放在导航控制器里面。如果您已将segue直接从EmojiTableViewController连接到AddEditEmojiTableViewController,那么它将按预期工作。

在你的第一个例子中,segue.destination是一个UINavigationController, which has nothing to do with theAddEditEmojiTableViewControllerclass. So force castingsegue.destinationtoAddEditEmojiTableViewController`将始终失败。

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


0
投票

在没有查看目标指南的情况下,将IB插入到navigationController中,然后它是不正确的并且您正确使用

let addEditEmojiTableViewController = segue.destination as! UINavigationController

但如果你编辑它,反之亦然

© www.soinside.com 2019 - 2024. All rights reserved.