代码之家  ›  专栏  ›  技术社区  ›  WhiteLine

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

  •  1
  • WhiteLine  · 技术社区  · 6 年前

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

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

    情况就是这样

    enter image description here

    结果

    来自指南

    点击单元格时的静态表视图控制器。开始时间 称为“AddEditEmojiTableViewController”。记住删除或 主情节提要,将静态表视图的“自定义类”设置为 “AddEditEmojiTableViewController”。将属性添加到 AddEditEmojiTableViewController类,名为emoji,类型为 表情符号。在prepare(for segue:)方法中 EmojiTableViewController,您将检查标识符,将 目标视图控制器,访问要传递的对象,然后分配 属性:

    AddedItemTableViewController

    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
        }
    }
    

    以这种方式打开prepare函数,当我点击一个单元格时,就会出现这个错误崩溃

    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 回复  |  直到 6 年前
        1
  •  1
  •   ielyamani    6 年前

    指南需要更新 ,你不应该 AddEditEmojiTableViewController EmojiTableViewController AddedItemTableViewController

    在你的第一个例子中 segue.destination 是一个 UINavigationController, which has nothing to do with the class. So force casting 序列目的地 to AddEditEmojiTableViewController`将始终失败。

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

        2
  •  0
  •   Shehata Gamal    6 年前

    let addEditEmojiTableViewController = segue.destination as! UINavigationController