简介

苹果公司于2019年度 WWDC 全球开发者大会上发布SwiftUI,它是基于Swift建立的声明式框架。该框架可以用于 watchOS、tvOS、macOS、iOS 等平台的应用开发。

它的主要目的是帮助开发者从页面布局中解脱出来,将更多的经历放在应用逻辑层面,而不是页面布局以及页面适配方面。

但是,SwiftUI毕竟时间短,有一些功能还没有完善,甚至有些控件是SwiftUI无法满足的。而且对于一个有着多年UIKit框架的开发经验的开发者来说,对于将UIKit封装成SwiftUI是必要的,因此,这篇文章会以UIKit的封装入手,来进行SwiftUI学习的开篇。

UIViewRepresentable 协议

对于SwiftUI的工程的创建,以及基础的View的搭建,我相信不需要我来介绍了,可自行到苹果官方文档中进行查看

UIViewRepresentable 协议是用于将UIView框架封装成SwiftUI的View的。协议内容包括:

  • associatedtype UIViewType : UIView 要呈现的视图
  • func makeUIView(context: Self.Context) -> Self.UIViewType UIView的初始化方法,相当于init方法
  • func updateUIView(_ uiView: Self.UIViewType, context: Self.Context) 当SwiftUI中有新内容更新到UIView上
  • static func dismantleUIView(_ uiView: Self.UIViewType, coordinator: Self.Coordinator) 移除UIView
  • associatedtype Coordinator = Void 协调UIView
  • func makeCoordinator() -> Self.Coordinator 创建自定义实例,当UIView中有更改时传达给 SwiftUI 界面。
  • typealias Context = UIViewRepresentableContext<Self> Context

从协议中基本可以看出我们在自定义View时所需要调用的方法了。

注意

  • UIViewRepresentable 协议必须使用 struct 类型,如果使用 classenum 类型时则会报错。
  • 如果需要给视图添加方法时,需要自定义Coordinator类,并遵循NSObject协议
  • 并在 makeCoordinator 方法中返回Coordinator类的对象

实战

好了,到目前为止,UIKit的框架封装原理已经完毕。下面自定义UITextView,可以直观的查看UIViewRepresentable协议。

这是一个比较简单的UITextView的封装,由于SwiftUI中目前并没有提供多行文本输入,而在应用中,不可避免的会使用到多行文本输入。

import SwiftUIstruct SimpleTextView: UIViewRepresentable {// 指定Context 可不写typealias Context = UIViewRepresentableContext<SimpleTextView>/// 自定义TextView的属性@State var placeholder: String = ""@Binding var text: String@State var onEditingChange: ((Bool) -> Void)? = nil// 创建UITextViewfunc makeUIView(context: Context) -> UITextView {let textView = UITextView()textView.delegate = context.coordinatortextView.font = UIFont.init(name: "PingFang SC", size: 14)textView.backgroundColor = .cleartextView.textColor = UIColor(0xabbfcc)textView.text = placeholderreturn textView}// 更新UITextView中的值func updateUIView(_ textView: UITextView, context: Context) {if textView.text != self.placeholder && !context.coordinator.isEditing {textView.text = text}}// 用于UITextView的扩展,由于需要使用UITextViewDelegate协议方法,因此该方法需实现func makeCoordinator() -> Coordinator {return Coordinator.init(self.placeholder, text: $text, onEditingChange: self.onEditingChange)}// 用于实现UITextViewDelegate方法class Coordinator: NSObject, UITextViewDelegate {var text: Binding<String>var placeholder: String = ""var isEditing = falsevar onEditingChange: ((Bool) -> Void)?init(_ placeholder: String = "", text: Binding<String>, onEditingChange: ((Bool) -> Void)? = nil) {self.placeholder = placeholderself.text = textself.onEditingChange = onEditingChange}func textViewDidChange(_ textView: UITextView) {self.text.wrappedValue = textView.text}func textViewDidBeginEditing(_ textView: UITextView) {if textView.text.isEmpty || textView.text == self.placeholder {textView.text = ""self.text.wrappedValue = ""} else {self.text.wrappedValue = textView.text}self.isEditing = trueself.onEditingChange?(true)}func textViewDidEndEditing(_ textView: UITextView) {if textView.text.isEmpty || textView.text == self.placeholder {textView.text = self.placeholderself.text.wrappedValue = ""} else {self.text.wrappedValue = textView.text}self.isEditing = falseself.onEditingChange?(false)}}
}

从上面的代码中就可以比较直观的查看该协议了。后续我会慢慢的讲解SwiftUI中的属性定义名称如 @State, @Binding, @Published, @Environment, @ObservedObject等所代表的含义以及相对于Swift中的含义。

iOS SwiftUI ☞ UIKit框架的封装使用相关推荐

  1. iOS基础-UIKit框架-高级视图-UIDatePicker

    用处:用在自定义键盘(点击文本框时弹出日期选择.) 一.自定义键盘 先连接TextField -(viewDidLoad){[super viewDidLoad]; //1.创建时间选择器 UIDat ...

  2. iOS UIKit框架注解

    本文来自简书,原文地址:http://www.jianshu.com/p/e5b995ecf44d 导语 我们追求技术的提升,关注技术的发展历程:作为从事技术工作的伐码猿,有个想法(仅是个人想法),这 ...

  3. ios开发瀑布流框架的封装

    一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...

  4. IOS开发学习---Fundation框架和UIKit框架

    框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像.声音文件等其他资源.共享资源库定义应用程序可以调用的函数和方法. iOS 提供了许多可在应用程序开发中使用的框架.要使 ...

  5. UIKit框架各个类的简介

    1.UIAcceleration: 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速数据.为了接收重力加速度,要注册一个应用应用程序作为一个共享UIAccelerate ...

  6. iOS的主要框架介绍

    1:原文链接:http://www.open-open.com/lib/view/open1343210425380.html 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的 ...

  7. Ios常用第三方框架(一)

    一.UI框架 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UIT ...

  8. UIKit 框架讲解

    下面是UIKit 子类的具体说明 1.UIAcceleration: 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速数据.为了接收重力加速度,要注册一个应用应用程序作 ...

  9. [iOS开发]——系统框架(effectiveOC2.0阅读笔记)

    系统框架 第47条:熟悉系统框架 要点 第48条:多用块枚举,少用for循环 for循环 使用 Objective-C 1.0的 NSEnumerator 来遍历 快速遍历 基于块的遍历方式 要点 第 ...

  10. iOS常用第三方框架

    iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角),ios冰山一角 图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用, ...

最新文章

  1. 中国科协发布20个重大科学问题和工程技术难题
  2. Web Application Stress Tool(WAS)性能测试
  3. python123测试3平方根格式化,【Python3学习】走进Python
  4. AngularJs+bootstrap搭载前台框架——准备工作
  5. hdu 5185(dp)
  6. linux父子进程字写父读无效,linux父子进程
  7. Qtum量子链帅初受邀火星特训营面对面授课
  8. java文件序列化_通过快速Java和文件序列化加快速度
  9. [Extjs 4] 类系统
  10. mysql预编译表名_JDBC预编译语句表名占位异常
  11. 电商平台实战经验:电商中的Hadoop生态系统应用
  12. 我也有了博客了,呵呵~~
  13. [TopCoder] SRM 587 DIV 2, 250p, 500p, 1000p, Solution
  14. 卷积在深度学习中的作用
  15. Linux下载hfs文件,linux读写mac HFS+
  16. php周签到功能思路,thinkphp签到功能实现方法
  17. 如何使用“GPU 呈现模式”进行卡顿问题定位
  18. python -- 字符串练习题
  19. Linux中使用iptables记录网络访问日志
  20. NYOJ 655 光棍YY(java)

热门文章

  1. Dragonfly软件电脑环境
  2. PowerWeChat 微信SDK 介绍
  3. numpy 矩阵对角线_python – 使用numpy将矩阵更高的对角线清零
  4. 【NLP】第16章 使用RNN 和注意力的自然语言处理
  5. Android DRM
  6. linux 安装 pcre
  7. php 英文转中文,php如何将英文引号转换为中文引号
  8. 计算机的了解以及组装
  9. 世界三大顶级音响_世界十大顶级音响排行榜前十名
  10. 发力1小时到家服务,山姆与京东到家共建前置仓获10倍坪效、60%月复购率