界面设计:在应用内打开浏览器
接下来,我们来学习在跳转到HomePageView页面的同时,打开浏览器并访问对应身份卡片的链接地址。
访问网页需要引用一个新的框架— —WebKit,WebKit是一款开源的浏览器框架,使用WebKit可以实现在应用内访问web网页地址的功能。
首先,我们先引用这个框架,如下代码所示:
import WebKit
然后我们实现下访问网页的方法,如下代码所示:
// MARK: - 网页方法 struct SiteView: UIViewRepresentable, View { var indexURL: String func makeUIView(context: UIViewRepresentableContext<SiteView>) -> WKWebView { return WKWebView() } func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<SiteView>) { let request = URLRequest(url: URL(string: "https://"+indexURL)!) uiView.load(request) } }
上述代码中,我们创建了一个结构体SiteView,遵循UIViewRepresentable协议,UIViewRepresentable协议可以将视图添加到SwiftUI界面中,并在适当的时间调用可表示实例的方法以创建和更新视图。
在SiteView网页视图中,通过传入一个String类型链接地址indexURL,调用uiView的WKWebView结构,访问并加载来自indexURL网站的数据,返回内容给到View视图中,实现访问网站的功能。
创建完成后,我们在HomePageView调用它,由于需要传入链接地址,因此在HomePageView中也要声明变量作为链接地址,且链接地址需要来自于ContentView身份卡片的地址,如下代码所示:
struct HomePageView: View { var platformName: String var indexURL: String @Environment(.presentationMode) var presentationMode var body: some View { NavigationStack { SiteView(indexURL: indexURL) .navigationBarTitle(platformName, displayMode: .inline) .navigationBarBackButtonHidden(true) .navigationBarItems(leading: backBtn()) } } // 返回按钮 func backBtn() -> some View { Button(action: { self.presentationMode.wrappedValue.dismiss() }) { Image(systemName: "chevron.backward") .font(.system(size: 17)) .foregroundColor(.black) } } } struct HomePageView_Previews: PreviewProvider { static var previews: some View { HomePageView(platformName: "稀土掘金技术社区", indexURL: "juejin.cn/user/3897092103223517") } }
上述代码中,我们声明了变量indexURL作为访问的链接地址,并在HomePageView的body视图中使用SiteView网站视图,SiteView网站视图的访问地址绑定声明的变量indexURL。
并且还需要在浏览器预览时添加默认值,便于模拟器预览效果,如下代码所示:
HomePageView(platformName: "稀土掘金技术社区", indexURL: "juejin.cn/user/3897092103223517")
由于HomePageView声明了变量indexURL,因此我们还要回到ContentView中给HomePageView声明的变量赋值,如下代码所示:
HomePageView(platformName:item.platformName, indexURL: item.indexURL)
项目预览
完成后,我们回到ContentView视图,在模拟器中预览下整体的效果,如下图所示:
项目小结
在本章中,我们学习了基于NavigationStack顶部导航菜单的跳转方法NavigationLink,并实现了自定义返回按钮及其操作。在本章核心内容,我们接触了一个新的框架WebKit,通过使用UIViewRepresentableContext和View视图,实现在应用内访问网页链接的功能。
电子名片本质上是一款短链接聚合工具,通过生成URL分享进行裂变,如此看来,Linkworld基本可以链接一切内容,如建立个人作品库,或者分享所有社交帐号集,亦或者管理自己的自媒体帐号等等,都可以通过Linkworld实现。
简单,但有趣。