如何通过Plist加载字符串数组并在UIWebView中加载对应URL?
解决字符串数组转URL并加载到UIWebView的问题
首先看你的代码,核心问题出在类型不匹配和不安全的强制解包上:
URL(string:)初始化方法需要的是单个String类型参数,但你直接传入了[String]数组,这会直接编译失败;- 多处使用
as!和!强制解包,一旦Plist里的webURL字段不存在、类型不是数组,或者数组里的字符串不是合法URL,都会导致崩溃。
修正后的代码(加载数组中第一个合法URL)
假设你想加载数组里的第一个有效URL,可以这么写:
if let path = Bundle.main.path(forResource: "BOITLIST", ofType: "plist"), let dictRoot = NSDictionary(contentsOfFile: path), let urlStrings = dictRoot["webURL"] as? [String] { // 遍历数组找到第一个合法的URL for urlString in urlStrings { if let url = URL(string: urlString) { webView.loadRequest(URLRequest(url: url)) break // 找到第一个就停止,加载它 } else { print("无效的URL字符串: \(urlString)") } } }
关键改进点
- 全程使用可选绑定(
if let)替代强制解包,避免崩溃; - 先把
webURL转成可选的[String],而不是强制as!; - 遍历数组逐个验证URL合法性,确保只有有效的URL才会被加载;
- 加入错误打印,方便调试无效的URL字符串。
如果需要处理多个URL(比如让用户选择)
如果你的Plist里的1-7个菜单项对应不同的URL,你可以先把所有合法URL收集起来,再展示给用户选择:
var validURLs: [URL] = [] if let path = Bundle.main.path(forResource: "BOITLIST", ofType: "plist"), let dictRoot = NSDictionary(contentsOfFile: path), let urlStrings = dictRoot["webURL"] as? [String] { validURLs = urlStrings.compactMap { URL(string: $0) } } // 之后可以用validURLs来生成UI选项,用户选择后加载对应的URL // 比如用户选了第0个: if let selectedURL = validURLs.first { webView.loadRequest(URLRequest(url: selectedURL)) }
另外提一句:UIWebView已经被苹果弃用了,建议换成WKWebView,API更现代也更安全哦。
内容的提问来源于stack exchange,提问作者William Loke
相关产品推荐
相关产品推荐

