无法将 UIViewController 类型的值转换为 PatternDetailViewController

Can't cast value of type UIViewController to PatternDetailViewController

我正在尝试将视图控制器向下转换为详细视图控制器,但做不到。我正在使用核心数据(第一次)。 错误出现在 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
        }
    }



}

图案细节ViewController.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
    }



}

如您所说,问题出在以下几行:

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 的事实让我怀疑您忘记在情节提要中的此视图控制器的身份检查器中输入任何视图控制器类型:

根据 PatternDetailViewController 中的 viewDidLoad() 判断,您似乎正在使用导航控制器。

如果 PatternDetailViewController 嵌入到 UINavigatonController 中,则导航控制器将是 segue.destinationViewController

像这样获取 PatternDetailViewController:

let vc: UINavigationController = segue.destinationViewController as! UINavigationController
let detailVC = vc.topViewController as! PatternDetailViewController
detailVC.pattern = self.selectedPattern

添加到亚光答案。有时,您可能还需要仔细检查身份检查器中的自定义 class Module

您的视图控制器需要属于特定的 Module。因此,请确保从列表中 select a Module。就我而言:

这刚好发生在我身上,我在关注这里的所有其他帖子后挣扎了几个小时。最后发现我的目标视图控制器文件缺少 .swift 扩展名。我希望这对其他人有帮助!

尝试清洁 产品 > 清洁

编辑:我遇到了相同的错误消息,并已使用此方法修复。这个答案可能没有具体回答问题

我按照以下步骤解决了这个问题:

  1. 在故事板中找到源场景。转到身份检查器(右侧面板中的第三个选项卡)
  2. 从身份检查器中删除 (Cut/ctrl+x) "Custom Class" 下的 "Class"。
  3. 切换到另一个场景。
  4. 切换回源场景。
  5. 粘贴您刚刚删除的自定义 class 模块。
  6. 退出XCode。
  7. 打开Xcode。
  8. 干净。
  9. 建造。

为什么有效?我在复制粘贴别人的作品。我可能在右侧面板中写了 Class 名称,然后才出现 class 名称。我的猜测是 Swift 无法动态地找到这些类型的东西。你必须按照它的意愿行事。你必须按照特定的顺序做特定的事情。

我的问题是:

不工作

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)

如果您从其他项目复制 Storyboard 文件并且没有更改 Module ,则可能会发生此问题。

上图中"EmployeeApp"是旧项目名,"clientTradingApp"是新项目名

快乐编码:)