You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:03:27