Swift playground 网页刷新切换随机页面的网页查看器WebKit

import SwiftUI

import WebKit

// MARK: - 配置区域

let minRange = 1 // 随机数最小值

let maxRange = 999 // 随机数最大值

// 网址模板

var urlTemplate = "https://www.a.com/page/{num}"

// MARK: - 主要视图

struct ContentView: View {

@StateObject private var viewModel = WebViewModel()

var body: some View {

ZStack {

// ✅ 背景:网页视图

WebView(webView: viewModel.webView, url: $viewModel.url)

.ignoresSafeArea()

// ✅ 前景:控制按钮

VStack {

Spacer() // 将按钮推到屏幕底部

HStack {

// --- 新增:回到第一页按钮 ---

Button(action: {

viewModel.loadFirstPage()

}) {

Image(systemName: "house.fill") // 首页图标

.font(.title2)

.foregroundColor(.white)

.frame(width: 50, height: 50)

.background(Color.green) // 绿色背景

.clipShape(Circle())

.shadow(radius: 5)

}

.padding() // 左侧留白

// --- 结束新增 ---

Spacer() // 将右边的按钮推到最右边

// ✅ 原有的:刷新按钮 (保持不变)

Button(action: {

viewModel.loadRandomPage()

}) {

Image(systemName: "arrow.clockwise")

.font(.title2)

.foregroundColor(.white)

.frame(width: 50, height: 50)

.background(Color.blue)

.clipShape(Circle())

.shadow(radius: 5)

}

.padding() // 右侧留白

}

}

}

.onAppear {

viewModel.loadRandomPage() // 启动时加载随机页

}

}

}

// MARK: - 视图模型 (ViewModel) - 已添加新方法

class WebViewModel: ObservableObject {

let webView = WKWebView()

@Published var url: URL?

// 生成随机数并加载网页

func loadRandomPage() {

let randomNumber = Int.random(in: minRange...maxRange)

loadPage(number: randomNumber)

}

// --- 新增方法:回到第一页 ---

func loadFirstPage() {

loadPage(number: minRange) // 直接跳转到 minRange (即第一页)

}

// --- 结束新增 ---

// 提取公共逻辑,避免重复代码

private func loadPage(number: Int) {

let urlString = urlTemplate.replacingOccurrences(of: "{num}", with: "\(number)")

if let url = URL(string: urlString) {

print("🔄 加载网页: \(url)")

self.url = url

webView.load(URLRequest(url: url))

}

}

}

// MARK: - WKWebView 的 SwiftUI 封装 (保持不变)

struct WebView: UIViewRepresentable {

let webView: WKWebView

@Binding var url: URL?

func makeUIView(context: Context) -> WKWebView {

webView.navigationDelegate = context.coordinator

return webView

}

func updateUIView(_ uiView: WKWebView, context: Context) {

if let url = url {

uiView.load(URLRequest(url: url))

}

}

func makeCoordinator() -> Coordinator {

Coordinator(self)

}

class Coordinator: NSObject, WKNavigationDelegate {

var parent: WebView

init(_ parent: WebView) {

self.parent = parent

}

}

}

相关推荐
Coder_张三1 天前
iOS 26 适配
前端·ios·swift
用户38034165882971 天前
崩溃率从 0.3% 到 0.04%:我们做对的不是修 bug,是让每个崩溃只发生一次
ios·swift
东坡肘子2 天前
当 Build in Public 重新转入地下 -- 肘子的 Swift 周报 #157
人工智能·swiftui·swift
用户38034165882972 天前
Flutter 迁 SwiftUI:AI 把页面"搬"过来只用了两周,我们补结构花了两个月
ios·swift
茶底世界之下3 天前
四角变换后的最小包围视口,为什么不能只把宽高取整?
ios·swift
茶底世界之下3 天前
预乘 Alpha 图层合成为什么会越叠越暗?
架构·swift
茶底世界之下6 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
Cc.Y6 天前
Swift深度链接的极简之道
ios·cocoa·swift
传奇开心果编程6 天前
【SwiftUI提高练中学】第9课 安全与隐私
swiftui·移动开发·swift·编程语言理论·开发范式·编程框架·声明式ui
茶底世界之下6 天前
动态切换 nearest / linear 时,为什么不能只替换 sampler
ios·swift