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

时间:2018-09-06 20:29:10

标签: ios swift

我将在本苹果指南https://itunes.apple.com/it/book/app-development-with-swift/id1219117996

的帮助下开始研究Swift。

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

这是情况

enter image description here

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

结果

根据指南

  

“您需要将Emoji对象从EmojiTableViewController传递给   轻按单元格时的静态表视图控制器。开始于   创建一个新文件,并定义一个UITableViewController子类   称为“ AddEditEmojiTableViewController”。记得删除或   注释掉文件中的任何表视图数据源方法。在   Main.storyboard,将静态表视图的“自定义类”设置为   “ AddEditEmojiTableViewViewController”。将属性添加到   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版本更新?

2 个答案:

答案 0 :(得分:1)

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

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

在第二个代码段中,代码的目标得以实现,因为遵循视图控制器树:test1是导航控制器,其根vc是test2,即{{1} }。

答案 1 :(得分:0)

如果没有将指南中的VC中的VC插入到navigationController内,那么它就不正确了,那么您就可以使用

let addEditEmojiTableViewController = segue.destination as! UINavigationController

但是,如果您对其进行了编辑,反之亦然