iOS - 无法在包中加载 NIB
Posted
技术标签:
【中文标题】iOS - 无法在包中加载 NIB【英文标题】:iOS - Could not load NIB in bundle 【发布时间】:2016-10-07 01:00:17 【问题描述】:我正在用 Swift 编写一个 ios 应用程序,它需要在 WKWebView
中显示各种静态 html 文件。
我的计划是创建一个带有@IBInspectable
属性的视图控制器,用于显示要显示的文件名。 HTMLViewController
将加载指定的文件,然后创建一个WKWebView
来显示它。
当我在模拟器(或我的设备)中运行应用程序并加载视图时,我在 Xcode 控制台中收到以下错误消息:
无法在 (MyApp.HTMLViewController) 上设置 (filePath) 用户定义的检查属性:无法在包中加载 NIB:'NSBundle /me/Library /Developer/CoreSimulator/Devices/A5982A49-71CD-4F06-ABD7-01EBBF001698/data/Containers/Bundle/Application/032D479A-091B-4FAB-9CB8-82DC72B99E89/MyApp.app>(已加载)'名称为 'pyN-vU-Kur-view-0DN-tc-q8g'
应用会加载并运行。 HTMLViewController 设置为来自 UITableView 上的附件的“显示”segue。只有当我点击附件时才会出现此错误。该应用程序仍然显示(空)视图,我可以使用导航控制器返回 UITableView 就好了。
使用一些grep
,发现pyN-vU-Kur
是View Controller的Object ID,0DN-tc-q8g
是里面UIView的ID。
我检查了我的构建阶段,并注意到情节提要列在 Copy Bundle Resources 部分中。我想这可能只是我的故事板中的引用被破坏的问题,所以我删除了场景并重新创建了它,但仍然看到同样的错误。我还看到了一些关于在检查器中检查目标成员资格的帖子。我已经验证了包含 HTML 文件、情节提要和视图控制器的 content
文件夹都选中了目标成员资格框。
调试显示正在加载 HTML 文件(我已将内容记录到控制台)并且正在调用 applyContent
方法,并且在调用 WKWebView()
时似乎发生了错误。
我的HTMLViewController.swift
代码如下:
import UIKit
import WebKit
@IBDesignable
class HTMLViewController: UIViewController
@IBInspectable
var filePath: String! = ""
didSet
if let path = Bundle.main.path(forResource: filePath, ofType: "html", inDirectory: "content")
do
let contents = try String(contentsOfFile: path)
self.applyContent(html: contents)
catch
print("problem reading file \(filePath)")
else
print("problem locating file \(filePath)")
func applyContent(html: String)
let webView = WKWebView(frame: self.view.bounds)
webView.loadHTMLString(html, baseURL: nil)
self.view.addSubview(webView)
是什么导致了这个错误,我该如何解决?我对 Swift 和 iOS 开发比较陌生,所以我可能缺少一些基本的东西。
【问题讨论】:
你是否在 plist 中从“主故事板文件基础名称”更改为“主要 nib 文件基础名称”? @Nazmul 不,我没有在我的 plist 中更改它。我刚刚尝试过,该应用程序甚至根本无法启动——它立即崩溃并出现类似的错误,但现在它找不到 Main。就我而言,该应用程序确实加载并运行,我只在导航到视图时看到该错误。此外,它不会使应用程序崩溃(我可以很好地导航回上一个视图)。将使用这些详细信息更新问题。 为新场景更改故事板上的包标识符 @NazmulHasan 我不确定你在问什么。我没有更改 Info.plist 中的包标识符,并且在故事板本身上看不到任何指定包标识符的地方。据我所知,故事板正在加载,因为我可以毫无问题地使用其中包含的视图,只是当我尝试打开这个特定视图时,我得到了错误。 好吧..打开你的类的身份检查器,在用户定义的运行时属性下选择属性名称 【参考方案1】:我认为问题可能是您尝试将 WKWebView
添加到尚未加载的 view
中。
IBInspectable
s 在加载视图的过程中很早就设置好了。尝试在viewDidLoad
或viewWillAppear
中添加您的WKWebView
。
import UIKit
import WebKit
@IBDesignable
class HTMLViewController: UIViewController
@IBInspectable
var filePath: String! = ""
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
if let path = Bundle.main.path(forResource: filePath, ofType: "html", inDirectory: "content")
do
let contents = try String(contentsOfFile: path)
let webView = WKWebView(frame: self.view.bounds)
webView.loadHTMLString(contents, baseURL: nil)
self.view.addSubview(webView)
catch
print("error loading file")
【讨论】:
你说的很对,把代码放在viewWillAppear
解决了我的问题!您发布的确切代码不太有效 - 我应该用我用来加载文件的确切代码更新您的答案吗?
当然,编辑!我要疯了。以上是关于iOS - 无法在包中加载 NIB的主要内容,如果未能解决你的问题,请参考以下文章
MonoTouch - 无法在包中加载 NIB:“NSBundle”
NSInternalInconsistencyException 无法在包中加载 nib