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

}

}

}

相关推荐
Tr2e6 小时前
🐱 从 0 到 1:用 Swift 手搓一个 macOS 桌面宠物(附源码)
macos·ios·swift
人月神话-Lee12 小时前
【WWDC】Core AI:iOS 端侧大模型新纪元
人工智能·ios·ai·swift·wwdc·core ai
2501_9160074713 小时前
iOS 开发工具选择指南 从编辑器、编译器到自动化构建
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
Fatbobman(东坡肘子)14 小时前
WWDC 2026 初印象:符合预期,但更务实 -- 肘子的 Swift 周报 #139
人工智能·macos·ios·swiftui·swift·wwdc
大熊猫侯佩1 天前
WWDC26 全网首发:SwiftUI 8 “可重排序“操作符深度解析
ios·swiftui·swift
人月神话-Lee2 天前
【图像处理】颜色空间——RGB之外的世界
图像处理·人工智能·ios·ai编程·swift·rgb·颜色空间
东坡肘子2 天前
WWDC 2026 初印象:符合预期,但更务实 -- 肘子的 Swift 周报 #139
人工智能·swiftui·swift
大熊猫侯佩2 天前
WWDC26 前瞻:苹果可能放出的“王炸”,不只是 Siri
xcode·swift·wwdc
看谷秀2 天前
swift part 6 三方库综合
swift