我开始在这份Apple指南的帮助下学习Swift:https://itunes.apple.com/it/book/app-development-with-swift/id1219117996
现在,我陷入了一个小问题,我想了解如何解决,但是从指南中来看并不太清楚。
这是情况
这是一个简单的应用程序,显示带有说明的表情符号列表。点击表情符号单元格,它应该打开静态表格视图并显示表情符号的信息。
结果
从指南
“您需要将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.destination
是UINavigationController, which has nothing to do with the
AddEditEmojiTableViewController class. So force casting
segue。目的地to
AddEditEmojiTableViewController`总是会失败。
在第二个代码段中,代码的目标有效,因为它遵循视图控制器树:test1
是导航控制器,其根vc是test2
,它是AddEditEmojiTableViewController
。