我将在本苹果指南https://itunes.apple.com/it/book/app-development-with-swift/id1219117996
的帮助下开始研究Swift。现在,我陷入了一个我想了解如何解决的小问题,但是从指南中并不清楚。
这是情况
这是一个简单的应用程序,显示带有说明的表情符号列表。轻按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版本更新?
答案 0 :(得分:1)
该指南需要更新,您不应该将AddEditEmojiTableViewController
放在导航控制器中。如果您已将Segue从EmojiTableViewController
直接连接到AddEditEmojiTableViewController
,它将按预期工作。
在您的第一个示例中,segue.destination
是UINavigationController, 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
但是,如果您对其进行了编辑,反之亦然