Swift5+Xcode15:iOS WebView应用Tab Bar点击加载网页问题
问题描述
在iOS WebView应用中设置了4个Tab Bar Item,期望点击每个项时打开不同网页,但点击Tab Bar无响应,print日志也没有输出。相关代码如下:
// // ViewController.swift // Oto // // Created by Emre Taner Çetinkaya on 19.08.2022. // import UIKit import WebKit import Foundation class ViewController: UIViewController, WKNavigationDelegate, UITabBarControllerDelegate { @IBOutlet weak var tabBar: UITabBar! @IBOutlet weak var profileButton: UITabBarItem! @IBOutlet weak var discountButton: UITabBarItem! @IBOutlet weak var urgencyButton: UITabBarItem! @IBOutlet weak var homeButton: UITabBarItem! @IBOutlet weak var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() self.tabBarController?.delegate = self setUpSetting(); loadData(link: "https://oto.com/") func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { let tabBarIndex = tabBarController.selectedIndex switch tabBarIndex { case 0: loadData(link: "https://oto.com/") print("press 0"); case 1: loadData(link:"oto.com//sayfa/acil-acil/") case 2: loadData(link: "https://oto.com//sayfa/fiyati-dusenler/") case 3: loadData(link: "https://oto.com//sayfa/giris-yap/") default: loadData(link: "https://oto.com/") } } } func setUpSetting () { let tabBarAppearance = UITabBarAppearance() let tabBarItemAppearance = UITabBarItemAppearance() tabBarItemAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] tabBarItemAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] tabBarAppearance.backgroundColor = hexStringToUIColor(hex: "3f475f") tabBarAppearance.stackedLayoutAppearance = tabBarItemAppearance tabBar.standardAppearance = tabBarAppearance tabBar.scrollEdgeAppearance = tabBarAppearance } func hexStringToUIColor(hex:String) -> UIColor { var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() if (cString.hasPrefix("#")) { cString.remove(at: cString.startIndex) } if ((cString.count) != 6) { return UIColor.gray } var rgbValue:UInt64 = 0 Scanner(string: cString).scanHexInt64(&rgbValue) return UIColor( red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: CGFloat(1.0) ) } func loadData(link : String) { let url = URL(string: link)! webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = true } }
问题原因分析
- 代理方法嵌套错误:
tabBarController(_:didSelect:)被定义在viewDidLoad()内部,属于局部函数,系统无法触发这个代理方法,自然不会响应点击事件。 - 代理类型不匹配:你直接在
ViewController中添加了UITabBar控件,而非使用UITabBarController架构,此时应该用UITabBarDelegate而非UITabBarControllerDelegate,原代码的self.tabBarController?.delegate = self设置无效(因为tabBarController为nil)。 - URL格式错误:部分链接缺少
https://前缀,还有路径里的多余//,会导致URL(string: link)初始化失败,WebView无法加载页面。
修复方案
1. 替换代理协议并设置正确代理
将类的协议改为UITabBarDelegate,并设置tabBar的代理为当前控制器:
class ViewController: UIViewController, WKNavigationDelegate, UITabBarDelegate { // ... 其他IBOutlet和属性 override func viewDidLoad() { super.viewDidLoad() tabBar.delegate = self // 关键:设置tabBar的代理 setUpSetting() loadData(link: "https://oto.com/") } }
2. 正确实现TabBar点击代理方法
将原来的代理方法移到类的顶层(不要嵌套在viewDidLoad里),替换为UITabBarDelegate的tabBar(_:didSelect:)方法:
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { guard let index = tabBar.items?.firstIndex(of: item) else { return } switch index { case 0: loadData(link: "https://oto.com/") print("press 0") case 1: loadData(link: "https://oto.com/sayfa/acil-acil/") // 补全https,修正多余// case 2: loadData(link: "https://oto.com/sayfa/fiyati-dusenler/") // 修正多余// case 3: loadData(link: "https://oto.com/sayfa/giris-yap/") // 修正多余// default: loadData(link: "https://oto.com/") } }
3. 修复URL加载的安全问题
在loadData方法中添加URL有效性判断,避免强制解包导致崩溃:
func loadData(link : String) { guard let url = URL(string: link) else { print("无效URL:\(link)") return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = true }
内容的提问来源于stack exchange,提问作者Emre Taner Çetinkaya
相关产品推荐
相关产品推荐

