转载内容 未读
Swift如何使用并发、同步和异步来提升性能本文为转载文章,仅作为备份使用,原文地址:
引用站外地址,不保证站点的可用性和安全性
Swift 并发初步
OneV's Den
本文是我的新书《Swift 异步和并发》中第一章内容,主要从概览的方向上介绍了 Swift 5.5 中引入的 Swift 并发特性的使用方法。
本文是我的新书《Swift 异步和并发》中第一章内容,主要从概览的方向上介绍了 Swift 5.5 中引入的 Swift 并发特性的使用方法。如果你对学习 Swift 并发有兴趣,也许可以作为参考读物。
你可以在这里找到本文中的参考代码。在本文写作的 Xcode 13 beta 2 环境下,你需要额外安装最新的 Swift 5.5 toolchain 来运行这些代码。
虽然可能你已经跃跃欲试,想要创建第一个 Swift 的并发程序,但是 “名不正则言不顺”。在实际进入代码之前,作为全书开头,我还是想先对几个重要的相关概念进行说明。这样在今后本书中 ...
经验分享 未读
ITMS-91053 Missing API declaration 解决方法今天上传应用发现谈了一大堆警告,对于警告洁癖的我表示非常的震惊。
基本上就是因为缺少隐私描述,但是我根本就没用第三方SDK啊,仔细一看发现是这两种:
NSPrivacyAccessedAPICategoryUserDefaults
NSPrivacyAccessedAPICategoryFileTimestamp
这两个确实用了,一个是用于存储用户的配置,一个是获取文件的时间戳。Apple要求说明这些行为是否会将数据与第三方共享,具体用于做什么。
那我们就来说明一下就好了。
添加隐私文件
添加App Privacy文件
Targets勾选所有的项目
这样我们就添加成功一个隐私文件啦
添加隐私说明选项添加隐私类型Privacy Accessed API Types
在里面的item0中添加Privacy Accessed API Type和Privacy Accessed API Reasons
Privacy Accessed API Type是用于告诉Apple这个API是什么API。
Privacy Accessed API Reasons是告诉Apple你用这个API拿 ...
经验分享 未读
Xcode如何管理项目的版本,修改项目版本号和build号我们如果没有正确更改版本号,就会有报错,例如:
warning: The CFBundleShortVersionString of an app extension (‘1.2’) must match that of its containing parent app (‘1.0’).
The CFBundleVersion of an app extension (‘1’) must match that of its containing parent app (‘4’)
但是如果我们的项目包含小组件等,修改起来就非常麻烦,每一个都需要修改。并且在最新版的Xcode中已经不支持在xcode里直接修改版本号了,这个框被隐藏了。
其实我们可以修改项目版本,然后让里面的target来同步这个版本号即可。
操作方法
进入Project > 主要的target > Build Settings。启用“级别”。
在过滤器中输入 CURRENT_PROJECT_VERSION 。
编辑项目级别的值(双击项目列中的空值)。
删除主目标水平的值(单击目标列中的值 ...
经验分享 未读
SwiftUI的ScrollView如何分页滚动ScrollView和UIScrollView一样可以分页
如果低于iOS 17在View的init里面加入UIScrollView.appearance().isPagingEnabled = true就行了。
12345678910111213141516171819202122232425262728293031323334353637383940struct TestOther: View { var body: some View { GeometryReader { geo in ZStack { ScrollView(.horizontal) { let items = [GridItem(.flexible())] LazyHGrid(rows: items, spacing: 0, ...
经验分享 未读
AppShortcuts快捷指令如何显示子自定义背景在 AppShortcut() 中确保已经添加 shortTitle 和 systemImageName 参数。如果你的快捷方式都没有这个,彩色面板将不会出现在快捷方式应用程序中。系统图像名称来自SF Symbols。
创建颜色在主应用的资产目录中创建颜色(例如 ShortcutsBackground1 、 ShortcutsBackground2 和 ShortcutsForeground)
两个背景色,一个前景色。
修改plist现在在Info.plist中添加 NSAppIconActionTintColorName 和 NSAppIconComplementingColorNames 。这需要在 CFBundlePrimaryIcon 中进行。
123456789101112131415161718<dict> ..... <key>CFBundleIcons</key> <dict> <key>CFBundlePrimaryIcon</key> <di ...
经验分享 未读
Xcode安装Simulator失败问题解决方法每次更新xcode都是折磨,需要反复尝试下载模拟器,还不支持断点续传,非常麻烦,找到一篇教程可以方便的进行安装模拟器。
iOS Simulator在下载过程中,总是失败。Failed - Could not download。
有没有什么好的办法可以进行下载呢,我们可以尝试使用手动下载,因为chrome支持短点续传,还是比较方便的。
下载模拟器进入开发者下载地址
找到需要版本的 Simulator Runtime。如果不知道你的xcode支持哪个版本的模拟器,那么可以看看自己下载失败的是哪个版本,就下载哪个版本。
点击 Simulator Runtime.dmg下载
下载过程中如果下载失败,可以点击“继续”继续下载,支持断点续传。
下载完成之后,我们获取一下文件地址。在访达中按下cmd+opt+c来复制文件地址。例如:
1/Users/zhheo/Downloads/iOS_17.4_Simulator_Runtime.dmg
然后我们打开终端app,然后在里面输入
1xcrun simctl runtime add "这里填 ...
经验分享 未读
SwiftUI如何绘制聊天气泡,自适应内容传统开发都喜欢使用.9图来做这种气泡,但是因为.9图只是一个图片,没有办法做动画效果、颜色动画、背景模糊效果等等。可编程性比较差,所以我个人来讲还是比较喜欢用SwiftUI的Shape的。
用SwiftUI来绘制气泡还是比较简单的,这里举一个例子。
实际效果
圆角矩形部分其实图中这种气泡只是分成了上下两个部分,一个是上面的小尾巴部分,一个是下面的圆角矩形部分。
我们很轻松就可以写下面圆角矩形的部分,并且来自适应里面的内容。
12345Text("你好啊!!你好吗,真的好吗好的好的") .padding(12) .foregroundColor(Color.white) .background(.blue) .cornerRadius(12, antialiased: true)
上面的小尾巴我们可以拆分下来,就是一个圆弧。
所以我们只需要用SwiftUI的Shape写一个这个圆弧就可以了。
圆弧绘制这个圆弧别看路径小,但是如果手写的话那也是相当 ...
转载内容 未读
如何在SwifUI中显示占位内容、显示骨架图的方法SwiftUI有非常方便的骨架屏显示方法,这在需要获取网络内容的界面显示非常重要。显示骨架屏相比转圈的加载中界面更加缓解用户等待的焦虑感。
SwiftUI有一个非常方便的方式添加,那就是:
12View .redacted(reason: .placeholder)
下面的内容来自查看英文原文学习如何使用占位符编写骨架屏。
您是否曾经使用过需要一段时间才能加载的移动应用程序或网站?缓慢的连接速度并不令人愉快,是吗?当您无法判断内容是否正在加载或在此过程中是否失败时,情况会更糟。
幸运的是,有几种方法可以在某些时间比预期更长时通知用户。最现代的方法之一是使用经过编辑的占位符。这些是在 iOS 14 中引入到 SwiftUI 中的。
在本教程中,你将了解:
如何在 SwiftUI 中利用占位符
为什么加载状态如此重要
隐藏私人用户信息的最佳做法
如何创建小部件
占位符是一种更现代的方法,用于展示 UI 的预览。此设计模式通常用于文本字段,其中字段显示提示,帮助用户了解要输入的内容。
占位符的另一个优势是能够隐藏私人信息。金融应用通常会在应用进入后台时执行此操作。在 SwiftUI 中 ...
经验分享 未读
SwiftUI的onAppear在NavigationView中不触发的问题今天水群看到有群友问问题:
目前他是用onappear来实现的。大致的例子如下:
123456789101112struct ContentView: View { var body: some View { NavigationView { NavigationLink(destination: DetailView()) { Text("跳转一个页面") } } .onAppear { print("我来啦") } }}
如何每次到这个ContentView的时候都触发print("我来啦")
解决方案其实这就是跟swiftui的机制有关,当你访问到DetailView()的时候,其实只是在NavigationView中显示了一个视图。
无论你是否跳转到子页面 ...
经验分享 未读
iOS开发如何检测手机是否安装了某一个应用,检测是否安装微信iOS应用大多都有urlscheme,比如通过广告点击进入的应用都需要来源标识,所以大多数应用都支持这个功能。并且在一些应用支持微信登录的时候,如果手机没有安装微信,根据Apple的要求是要隐藏微信图标的。那么我们就要先知道用户手机有没有安装微信才行。
首先配置url白名单我们需要将微信添加白名单才可以检测是否安装微信。
进入项目的设置中。
添加一条配置项目:LSApplicationQueriesSchemes
将我们需要的应用链接添加进来。
例如微信的urlscheme为:weixin://
那么我们的白名单填写weixin
通过urlscheme检测是否安装微信然后我们需要在代码部分进行判断。
1234567///检测应用是否被安装func isAppInstalled(scheme: String) -> Bool { if let url = URL(string: scheme) { return UIApplication.shared.canOpenURL(url) } return false& ...
经验分享 未读
SwiftUI的MacOS项目如何给应用添加开机启动项,登录时自动启动最近在研究如何让敲木鱼支持开机自动启动,从SMLoginltemSetEnabled研究到SMAppService。因为敲木鱼是只支持macOS13版本以上的应用,所以我只需要适配SMAppService就可以了。SMAppService非常方便。
文档文档地址
我们可以用mainApp就可以实现添加本应用的启动项操作。
通过登录启动项状态可以看到目前登录项目是否被开启。
通过register和unregister可以实现添加和删除启动项。
示例123456789101112131415161718192021222324252627282930import SwiftUIimport ServiceManagementstruct ContentView: View { @State var launchAtLogin: Bool init() { self.launchAtLogin = SMAppService.mainApp.status == .enabled } var body: s ...
经验分享 未读
如何在Swiftui中如何使用SF符号SF Symbols在构建Swiftui项目时,如果是比较遵循Swiftui的结构,那么大家肯定都非常乐意使用Apple自带的SFsymbols图标。那么这个文章就是来介绍我是如何使用SFsymbols来构建我的应用的。
下载客户端你需要使用SFsymbols客户端来查看所有支持的图标,这是一种非常便捷的方式。并且因为你只需要在应用中访问,而不是网页,所以打开速度和性能非常棒。
下载客户端
安装完成我们就可以看到图标了
使用图标最简单的使用就是在Swiftui下使用systemName的Image。例如:
1Image(systemName: "star")
那么这个systemName是哪里来的呢
选择我们需要的图标,按下command+shift+c即可复制你选中的图标的名称。
版本适配我们需要注意,一些新的图标是不支持旧版系统的。所以当你使用iOS16专属图标时,在iOS15的设备上则什么都不显示。
所以你需要注意图标的版本问题。
展开检查器,我们可以看到单色图标的适配版本。
在文本中插入图标sfsymbol本身是字体图标,所以我们可以在文本中非常方便的插入图标。例如
1 ...
经验分享 未读
Xcode真机运行报错:Failed to prepare the device for development解决方法因为家庭app底层升级所以被迫更了iOS系统,结果发现最新的Xcode14.2竟然不支持iOS16.4。。。无了个大语。
总不能干等着Xcode更新吧。。。
找了一顿发现有个github项目在维护Xcode支持系统的Device Support,于是分享给大家。
当你遇到此报错当你遇到报错:Failed to prepare the device for development. This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You may also need to restart your Mac and device in order to correctly detect compatibility.
首先你应该做的是尝试重启你的iOS设备。
重启连不上之后可以查看一下你的Xcode版本是否支持你现在的手机系统。
增加Xcode系统支持进入 iOSDeviceSupport项目(或者Github在 ...
翻译内容 未读
如何让iOS应用支持更换图标,用户自定义应用图标功能开发之前给敲木鱼做的一个更换图标功能,其实做这个功能比我预想的简单多了,很多应用的付费功能都包含尊贵VIP图标等等。这个是我开发时看到的教程。翻译一下发上来,并且添加了一些坑的规避。帮助更多的开发者支持这个功能。
本文为转载文章,以下内容来源于
How to change your app icon dynamically with setAlternateIconName()
hackingwithswift
iOS为开发者提供了以编程方式改变其应用程序图标的能力,尽管需要花点功夫来设置。它也不像你希望的那样强大–例如,你不能重新创建时钟应用程序的移动指针。改变你的应用程序的图标的实际代码是微不足道的,但首先有一些设置工作,因为你必须在你的Info.plist文件中声明所有可能的图标。这背后的过程远非最佳,现在最好的做法是将你的Info.plist编辑成XML,而不是试图使用Xcode中的内置属性列表编辑器。
为了开始工作,我们 ...
经验分享 未读
Swift的User Defaults报错:Failed to read values in CFPrefsPlistSource解决方法近期每次运行都发现报错,找了好久找到了方法。不过根据这个方法改完之后还需要自己迁移一下User Defaults的group地址中的数据。否则老用户打开直接就没数据。
错误提示1[User Defaults] Failed to read values in CFPrefsPlistSource<0x1700f1280> (Domain: group.x.p.t.o, User: kCFPreferencesAnyUser, ByHost: Yes, Container: (null)): Using kCFPreferencesAnyUser with a container is only allowed for System Containers, detaching from cfprefsd
解决方法在我们的appgroup地址填写规范时,只填写了group.com.***.***这种形式,但是这种形式我们其实是不允许使用的。我们正确的格式应该是teamid.group.com.***.***
所以只要更改自己appgroup的变量地址即可消除这个报错。
查询自 ...
转载内容 未读
Xcode的Swift添加注释方法,添加注释、标记弃用、标记改名、编写代码文档一直以来我只是用双斜杠进行注释,但是我发现Xocode官方会有专门的注释,按option点击就会出现相关的注释内容。研究了一下发现Swift的注释非常强大。
本文为转载文章,以下内容来源于
Xcode 中的 Swift 代码注释
Wei_You
前言写代码也有一段时间了,代码中注释也是写了不老少,但在和同事一起开发的时候才发现了问题,大家注释的样子各成一体,没有能写出苹果官方注释的样子。大概就是注释的语法上出了问题,于是自己就主动学习了下 Swift代码的注释语法格式,记录下自己学到的东西。
注释语法单行注释1// 单行注释
单行注释主要出现在. swfit 文件的顶部,记录代码文件的一些信息。
另外也出现在代码中,用于记录对于单行代码的解释。
单行文档注释1/// 单行文档注释
当我们用 ⌥ + 鼠标左键,点击代码时,可以查看属性或者方法的文档页面,更直观的查看代码的文档说明。
多数时候,我们都在使用这个方法注释类, ...
经验分享 未读
SwiftUI让应用支持从第三方app中打开文件,让自己的应用添加到分享表单中敲木鱼的创意工坊功能已经支持了导入文件的方法,但是导入文件对于有Mac的小伙伴比较方便,隔空投送保存在文件app,然后再导入。但是对于只有手机的用户来说着实是太费劲了。
那么如果支持通过第三方app导入例如微信、网盘自带的「使用第三方应用打开」直接打开音频文件可就方便太多了。
配置info文件首先就是需要CFBundleDocumentTypes,可以参考文章iOS 从其他App获取文件
配置文件打开类型是原地打开还是拷贝到app中打开
配置LSSupportsOpeningDocumentsInPlace,YES为原地打开
接收URL应用启动后可以通过swiftui的onOpenURL来获取链接
1234ContentView() .openURL {url in //这里就是获取文件地址之后的动作 }
大功告成!仅仅三步即可实现导入文件。
经验分享 未读
Xcode和Appstore应用语言显示英文解决方法,如何把应用语言设置成中文删除英文群里有小伙伴问他的应用只用中文开发,但是在Appstore上只显示英文,想要把Appstore上的语言展示换成中文。
在Xcode中,如果你从未配置过语言,那么默认你的软件语言就是英文。
【此教程只为为了删除英文而使用中文的小伙伴准备的,其他需求请自行融会贯通】
需求位置
添加中文语言在项目里添加中文
修改开发语言进入访达,显示包内容
使用vscode(或其他文本编辑软件)打开project.pbxproj
搜索region
将developmentRegion对应的en改成zh-Hans
回到项目里删除英文
大功告成现在你的应用就只显示中文了!
经验分享 未读
解决AppClip开发遇到的app identifiers问题在尝试上架AppClip的时候发现这是从未踏足过的新领域,全都是深渊巨坑。创建测试一切都好,就在上传的时候遇到非常坑的提示。
1234App Store Connect Operation ErrorMissing entitlement. This app contains an app clip. The entitlement'com.apple.developer.associated-appclip-app-identifiers' should be present and include thevalue of the app clip's application identifier.
这是个Xcode的问题,但是我们只能自己来解决。
成功解决
问题原因这个问题原因是Xcode为Clip应用创建了一个com.apple.developer.parent-application-identifiers,但是很不负责任的没有给你的iOS主程序添加相关的授权。
授权为:com.apple.developer.associated-appclip- ...
我的项目 未读
敲木鱼App - 打节拍敲音效解压神器一开始做敲木鱼的时候也是受到网上很多电子木鱼的启发,用了一下目前的几个木鱼软件,一个是界面令人窒息,交互体验令人崩溃,还有音效少而且有点太贵了。
并且这个应用本身不是很复杂,按照音效收个6块或者10多块我感觉有点割韭菜。
设计在这个软件上仍然保留了和其他软件接近的简洁设计,保证在闭眼盲操作的情况下点击屏幕仍然可以正常的使用。
并且在切换不同的音效上,在偏好设置有一些小动画,而且不同的音效还配合了不同的背景色彩、文字色彩。让人使用起来有赏心悦目的感觉。
所有插画均为我自己绘制的,音效也是自己采样调音的,相信能给你带来独一无二的有趣体验。
并且支持多个语言。
承诺无广告。
交互在交互上主要仍然通过点击操作来触发音效,比较困难的是点击是在按下时触发音效,而不是抬起,这样有更好的手感。在SwiftUI上制作这种还比较困难。最后还是克服了。
比较方便的点是比如敲木鱼时,最开始人们的心情总是期望平静,一开始会比较慢一些,随着时间的推移会越来越快。「敲木鱼」内置了四个速度,分别名为「深邃」「生命」「乐章」「迸发」。四个速度可以在主界面就可以点击切换。不需要每次调节速度都要点开设置。
并且可以在主 ...
经验分享 未读
SwiftUI打开Mac系统偏好面板方法,打开指定偏好设置面板指定设置mac程序经常会用到要求用户更改安全设置、隐私设置等问题的情况,所以需要弹出系统设置界面让不精通mac操作的用户能够轻而易举的修改偏好设置。
使用URL Scheme首先我们想到的就是使用urlScheme来打开窗口。在swiftUI下使用urlScheme非常容易。
我们需要在结构体中引用
1@Environment(\.openURL) var openURL
之后我们来打开url
1openURL(URL(string: "https://blog.zhheo.com/")!)
我们就完成了一个打开网页的操作。将网页url更换成urlScheme同样可用。
那么需要更改成什么url呢?
URL Scheme 格式部分控制面板支持通过 URL Scheme 进行访问。在各个控制面板对应的 .prefpane 文件里的 Info.plist 中,如果有下面这一键值对,则表示这个面板支持 URL Scheme:
12<key>NSPrefPaneAllowsXAppleSystemPreferencesURLScheme ...
翻译内容 未读
掌握 SwiftUI 中的 FocusState 属性包装器,输入框焦点判断
本文为翻译内容,来自swiftwithmajid翻译:张洪Heo推荐访问原文地址:立即访问
SwiftUI 在上次 WWDC 期间变得非常强大。我们获得了许多新功能,其中之一是全新的FocusState属性包装器。FocusState属性包装器允许我们读取和写入视图层次结构中的当前焦点位置。本周我们将学习如何使用FocusState属性包装器和聚焦视图修饰符在 SwiftUI 应用程序中管理焦点。
关于FocusStateSwiftUI 提供了一个新的FocusState属性包装器,适用于所有 Apple 平台,并允许我们专注于特定视图或检查该视图是否已经获得焦点。使用起来毫不费力。让我们看看如何使用它。
12345678910111213141516171819import SwiftUIstruct SignInView: View { @FocusState private var isEmailFocused: Bool @State private var email = "" var body: some View ...
经验分享 未读
Xcode13软件使用自定义字体方法,swiftUI使用otf、ttf文件方法在项目中不可避免使用到自定义字体,但是Xcode13将配置自定义字体的info.plist文件移除了。虽然我们可以通过各种奇怪的操作将文件恢复回来,但是时代总是在进步,总不能一直用旧的吧。
其实Xcode13已经给我们提供了编辑info的方法,就在target的配置中。
将字体文件拷贝到项目中首先打开字体册app,找到需要的字体,选择在访达中显示
拖拽到项目中,勾选target
编辑info
添加自定义字体配置在Custom iOS Target Properties中点击加号新建一个第一层级的配置项。
填写Fonts provided by application
展开后在item后面填写字体文件名和扩展名
查看字体全名我们使用之前需要知道这个字体叫什么。在访达中查看字体信息。右键单击文件选择显示简介。
在SwiftUI中使用12Text("自定义字体") .font(.custom("字体名称",size:27))
参考链接Adding custom font to Xcode 13 ...
经验分享 未读
SwiftUI 格式化数字方法,Double转String去除0的占位,防止科学计数法数字和文本之间的转化是我们经常用到的,例如TextField只能是String的Bing(当然Xocode13 for iOS15/mac os 12以上已经支持其他格式)。
常用的转换形式我们经常使用字符串格式说明符来更改格式,例如
1234567import Foundationvar number = 123.239var stringNumber = String(format: "%.2f", number)print(stringNumber)//输出 123.24
在SwiftUI的Text中我们也可以使用specifier来格式化显示的文本
1Text("\(number, specifier: "%.2f")")
常用的数据格式一般来说我会常用%.2f这种固定小数点位数的,代表小数点后固定两位。整数直接转基本没什么问题。麻烦就在于Double转String时,去除小数点后多余的0。例如使用%f会产生多余占位符,使用%g当数字很大时会用科学技术法表示。
123456var number: Doub ...
经验分享 未读
SwiftUI中ForEach如何获取当前的index,获取foreach循环排序号foreach的view循环是比较常用的循环方式,有的时候例如list/form项目需要点击时,需要告诉下一层级我们点击的是哪个东西。所以这个时候我们就需要获取点击项目的index信息。
使用数组范围1234567891011121314struct ContentView: View { @State private var array = [1, 1, 2] func doSomething(index: Int) { self.array = [1, 2, 3] } var body: some View { ForEach(0..<array.count) { i in Text("\(self.array[i])") .onTapGesture { self.doSomething(index: i) } } }}
使用索 ...
经验分享 未读
SwiftUI mac 自定义鼠标指针样式,自定义悬浮状态手指样式swiftUI似乎没有对按钮等组件自动添加上悬浮可以点击的鼠标指针变化,这容易让人产生疑惑,特别是你做了一个可以点击的Image或者Text组件,或者通过这种组件配合修饰符自己创造的按钮时,用户并不知道这个东西是否可以点击,因为鼠标没有变化。
那么mac上的swiftUI如何给鼠标添加上指针变化呢?
参考实例在需要修改鼠标悬浮样式的元素添加onHover修饰
1234567.onHover { inside in if inside { NSCursor.pointingHand.push() } else { NSCursor.pop() }}
参考文章NSCursor
经验分享 未读
SwiftUI mac 自定义菜单栏并支持跳转到链接,打开URL网页链接SwiftUI在mac上更改菜单栏远没有storyboard直观,在Swiftui上并没有一个能够控制菜单栏的View文件或者UI的方式来编辑菜单栏,相比storyboard的菜单栏编辑来说,感觉是编程体验的倒退。
那么在swiftUI中如何编辑菜单栏呢?
使用 .commands修饰符1234567891011121314151617@main struct MyApp: App { var body: some Scene { WindowGroup { ContentView() }.commands { CommandGroup(replacing: .help) { Button(action: {....}) { Text("MyApp Help") } } CommandMenu("Edit") { ... } }& ...
我的项目 未读
SwiftUI如何进行多语言设置,如何进行本地化?单复数变换?一些小型的工具类应用还是比较推荐支持多语言的,毕竟语言是使用软件的最大门槛。如果没有掌握语言,使用这个应用仅靠着图形界面来说除非是常用应用,否则根本不会使用。特别对于年纪较大的人来说更不友好。如何使用SwiftUI的情况下还能够尽兴本地化呢?
起始项目我这里创建了一个项目,进行了一个基本布局。
1234567891011121314struct ContentView: View { @State var name = "小明" @State var appleCount = 2 @State var orangeCount = 1 var body: some View { VStack { Text("你好世界") Text("\(name)!我们都有什么?") Text("我们有 \(appleCount) 苹果") Text(" ...
经验分享 未读
SwiftUI使用ForEach的onDelete来删除列表视图的数据我们常用Foreach来遍历数组生成一个列表视图,SwiftUI为我们提供了非常简单方便的删除方式。在看过其他人发布的代码里经常能看到无法使用数组直接remove的情况,这里介绍一个正确的使用方法。
界面样式
代码123456789101112131415161718192021222324252627282930import SwiftUIstruct ContentView: View { @State private var numbers: [NumberInfo] = [ NumberInfo(num: 1, info: false), NumberInfo(num: 2, info: true), NumberInfo(num: 3, info: false) ] var body: some View { VStack { Form { ForEach(numbers, id: \.self) ...
翻译内容 未读
SwiftUI创建主屏幕快捷操作,长按应用图标使用3dtouch菜单制作应用使用快捷的主屏幕链接是常用的快速进入到某一个功能所必备的方式。那么如何让应用支持主屏幕快捷操作呢?
本文为翻译内容,来自Jeeva Tamilselvan
本文有删减,推荐访问英文原文地址:Home Screen Quick Actions — SwiftUI 2.0
翻译: 张洪Heo(转载注明出处)
非原创内容须知
iOS 12中引入了主屏幕快速操作。这是一个快捷按钮,可以将用户导航到应用程序中的特定位置。如今,许多应用程序都带有这种快速行动功能。在这篇文章中,我们将学习如何在SwiftUI应用生命周期(2020)中实现“主屏快速操作”。
我们开始吧
创建动态菜单动态快速操作在运行时添加到应用程序。这些快速操作是分配给UIApplication的共享实例的UIApplicationShortcutItem数组。
让我们在App struct(也就是SwiftUI生命周期中应用的入口点struct)中创建一个函数。
1234567891011121314151617181920212223242526272829303132@mainstruct Quick_Actions ...