我试图将视图控制器向下转换为详细视图控制器,但不能。我正在使用核心数据(第一次)。 错误在prepareForSegue方法中,并显示:"无法转换类型' UIViewController' (0x1b81cdc)到' Patternz.PatternDetailViewController' (0x32488)。 (lldb)"
希望解释为什么它不起作用。 这是文件。
ViewController.swift
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var patterns : [Pattern] = []
var selectedPattern : Pattern? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.tableView.dataSource = self
self.tableView.delegate = self
createTestPatterns()
var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
var request = NSFetchRequest(entityName: "Pattern")
var results = context.executeFetchRequest(request, error: nil)
if results != nil {
self.patterns = results! as! [Pattern]
}
}
func createTestPatterns() {
var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
var pattern = NSEntityDescription.insertNewObjectForEntityForName("Pattern", inManagedObjectContext: context) as! Pattern
pattern.name = "Dress Shirt"
pattern.frontimage = UIImageJPEGRepresentation(UIImage(named: "examplePattern.jpg"), 1)
context.save(nil)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.patterns.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
var pattern = self.patterns[indexPath.row]
cell.textLabel!.text = pattern.name
cell.imageView!.image = UIImage(data: pattern.frontimage)
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.selectedPattern = self.patterns[indexPath.row]
self.performSegueWithIdentifier("patternDetailSegue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "patternDetailSegue" {
var detailViewController = segue.destinationViewController as! PatternDetailViewController // Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'
detailViewController.pattern = self.selectedPattern
}
}
}
PatternDetailViewController.swift
import UIKit
class PatternDetailViewController: UIViewController {
var pattern : Pattern? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.navigationItem.title = self.pattern!.name
}
}
答案 0 :(得分:62)
正如你所说,问题在于以下几点:
if segue.identifier == "patternDetailSegue" {
var detailViewController = segue.destinationViewController as! PatternDetailViewController
// Could not cast value of type 'UIViewController' to 'Patternz.PatternDetailViewController'
错误消息告诉您此segue的destinationViewController
而不是,实际上是PatternDetailViewController。你可能认为它是,但事实并非如此。您需要在故事板中检查此segue,并在目标端查看真正的内容。
错误消息将其描述为UIViewController的事实让我怀疑您忘记在故事板中此视图控制器的Identity检查器中输入任何视图控制器类型:
答案 1 :(得分:36)
添加哑光答案。有时,您可能还需要从Identity检查器中仔细检查自定义类模块。
您的视图控制器需要属于特定的Module
。因此,请务必从列表中选择Module
。就我而言:
答案 2 :(得分:7)
您似乎正在使用导航控制器,根据viewDidLoad()
中的PatternDetailViewController
判断。
如果PatternDetailViewController
嵌入了UINavigatonController
,则导航控制器将为segue.destinationViewController
。
像这样获取PatternDetailViewController:
let vc: UINavigationController = segue.destinationViewController as! UINavigationController
let detailVC = vc.topViewController as! PatternDetailViewController
detailVC.pattern = self.selectedPattern
答案 3 :(得分:0)
这恰好发生在我身上,在这里所有其他帖子之后,我挣扎了几个小时。最后,结果发现我的目标视图控制器文件缺少.swift
扩展名。我希望这有助于其他人!
答案 4 :(得分:0)
我按照以下步骤解决了这个问题:
为什么起作用?我正在复制粘贴别人的作品。我可能在存在具有该名称的类之前,在右侧面板中写了“类名”。我的猜测是Swift不能动态找到这类东西。您必须按照自己的意愿行事。您必须按照特定的顺序进行某些事情。
答案 5 :(得分:0)
我的问题是:
不起作用
let aBCViewController = UIViewController(nibName: "ABCViewController", bundle: nil) as! ABCViewController
present(aBCViewController, animated: true, completion: nil)
工作
let aBCViewController = ABCViewController(nibName: "ABCViewController", bundle: nil)
present(aBCViewController, animated: true, completion: nil)
答案 6 :(得分:0)
如果您从其他项目复制 Storyboard 文件并且未更改 Module ,则可能发生此问题。
在上图中,“ EmployeeApp”是旧项目名称,“ clientTradingApp”是新项目名称
快乐编码:)
答案 7 :(得分:-1)
尝试清洁 产品>清洁
编辑:我遇到了相同的错误消息,并且使用此方法已将其修复。该答案可能没有具体回答问题