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

}

}

}

相关推荐
茶底世界之下2 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_915909062 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子2 天前
一场关于 SwiftUI 动画的“原生”之争 -- 肘子的 Swift 周报 #154
人工智能·swiftui·swift
2501_915918413 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
9765033353 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
传奇开心果编程4 天前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift
丿Wayne4 天前
iOS Token 刷新实战(Actor 避免并发重复刷新)
ios·swift·token·actor·swift并发
大熊猫侯佩5 天前
独立 App 首发完成 iPhone Duo 展开态适配
ios·swiftui·swift
SoaringHeart6 天前
Swift 进阶&封装:仿 Get 给SwiftUI 添加路由导航能力
swiftui·swift
2501_915918416 天前
使用 VS Code 写 Swift 做 iOS 开发,插件能实现哪些功能,还有哪些短板
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程