每当我在 tableView 行中选择一行时,Swift 都无法到达目标类

Posted

技术标签:

【中文标题】每当我在 tableView 行中选择一行时,Swift 都无法到达目标类【英文标题】:Swift unable to get to the destination class whenever I select a row in the tableView row 【发布时间】:2021-07-23 00:25:27 【问题描述】:

简单的情况。每当我在 View1 中选择一行时,我都会崩溃。

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let storyboard = UIStoryboard(name: "NextScreen", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "NextScreenViewController") as! NextScreenViewController
    self.navigationController?.pushViewController(controller, animated: false)
  

我确实有一个 NextScreen.xib,它是此类 NextScreenViewController 的所有者 帮助将不胜感激!

【问题讨论】:

是否有崩溃错误消息或以红色突出显示的行? 你需要确保你的故事板有一个 NextScreenViewController 注册了标识符 NextScreen。 我在 AppDelegate 中看到一条崩溃消息 【参考方案1】:

您的代码和描述不匹配。您的代码要求您有一个名为“NextScreen”的 Storyboard 文件,其中包含一个标识符为“NextScreenViewController”的视图控制器,它是 NextScreenViewController 类型的 UIViewController 的子类。

您的描述说您有一个 NextScreen.xib,它“是此类 NextScreenViewController 的所有者”。您的代码不会尝试从 XIB 加载视图控制器。它正在尝试从情节提要中加载它。是哪个?

XIB 文件和 Storyboard 是在项目中包含视图的两种不同方式。如果将视图控制器的视图保存在 XIB 中,则需要从 XIB 加载它们。如果将它们保存在情节提要中,则需要从情节提要中加载它们。 如果您将视图控制器的视图保存在 XIB 文件中,然后尝试从情节提要中加载它们,您的应用将会崩溃。

您添加到问题中的崩溃日志清楚地表明您尝试加载的情节提要不存在,这就是您崩溃的原因。它说“找不到名为‘PlacesPlusScreen’的情节提要。”这是肯定的证据。

您的项目中是否有名为“NextScreen”的 Storyboard 文件或 XIB 文件?哪条线路崩溃了?确切的错误信息是什么?

尝试像这样更改您的功能:

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let storyboard = UIStoryboard(name: "NextScreen", bundle: nil)
    guard let controller = storyboard.instantiateViewController(withIdentifier: "NextScreenViewController") as? NextScreenViewController else 
        print("Can't load storyboard with ID 'NextScreenViewController'")
        return
    
    self.navigationController?.pushViewController(controller, animated: false)
  

注意你的行

let storyboard = UIStoryboard(name: "NextScreen", bundle: nil)

如果无法加载您的情节提要文件,您的程序将崩溃并抛出异常,说明“在捆绑包中找不到名为 'NextScreen' 的情节提要...”。

因此,您需要再次查看控制台中的确切崩溃消息,如果您需要我们帮助调试问题,请在此处报告。

【讨论】:

查看我的答案的编辑。当您将视图控制器的视图保存到 XIB 文件时,您正尝试从 Storyboard 加载视图控制器的视图。【参考方案2】:

这是崩溃的地方

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let storyboard = UIStoryboard(name: "PlacesPlusScreen", bundle: nil)
    guard let controller = storyboard.instantiateViewController(withIdentifier: "PlacesPlusScreenController") as? PlacesPlusScreenController else 
            print("Can't load storyboard with ID 'PlacesPlusScreenController'")
            return
        
       self.navigationController?.pushViewController(controller, animated: false)

  

这里是类

class PlacesPlusScreenController: UIViewController

这是 xib 文件和 PlacesPlusScreen 所在的层次结构。

这是崩溃报告

07-22 20:49:44.080494-0700 Example[14820:6956631] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'PlacesPlusScreen' in bundle NSBundle </private/var/containers/Bundle/Application/87BBA05A-9FF9-4851-A4FB-05DF7938E232/Example.app> (loaded)'
*** Ffirst throw call stack:
(0x184c9e754 0x1997657a8 0x187810ffc 0x102fbca0c 0x102fbc730 0x102fbcaec 0x18789f1d0 0x18789ed78 0x18789f538 0x187b69c98 0x18769c6c4 0x18768b03c 0x1876bef10 0x184c175e0 0x184c11704 0x184c11cb0 0x184c11360 0x19c24f734 0x18768c584 0x187691df4 0x102fc9478 0x1848cdcf8)
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'PlacesPlusScreen' in bundle NSBundle </private/var/containers/Bundle/Application/87BBA05A-9FF9-4851-A4FB-05DF7938E232/JacquardSDK_Example.app> (loaded)'
terminating with uncaught exception of type NSException
(lldb) 

【讨论】:

【参考方案3】:

只能这样做!

 let vc = PlacesPlusScreenController()
 self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

这将创建一个PlacesPlusScreenController 的实例,但它不会从您的 nib (XIB) 文件中加载任何视图。以这种方式调用视图控制器通常是错误的。您应该使用 init(nibName:bundle:) 从 nib (XIB) 文件创建视图控制器。 (它们以前被称为 nib 文件,但被重命名为 XIB。许多功能仍然将它们称为 nibfiles,Mac/ios 老前辈仍然这样称呼它们。)

以上是关于每当我在 tableView 行中选择一行时,Swift 都无法到达目标类的主要内容,如果未能解决你的问题,请参考以下文章

打开 TableView 并选择行

如何在 TableView 的行中应用不同的单元格样式

选择表格中的单元格无法正常工作

当我在 tableView 的最后一行单击“更多数据...”时,TableView 不会重新加载数据

选择 TableView 中的每一行,包括屏幕外的行

在 didselect 行中我的第一行返回标签文本而不是我的自定义标签文本