swiftUI 中的导航比较
SwiftUI 中的导航视图:NavigationLink、navigationDestination、NavigationView、NavigationStack 和 NavigationSplitView 比较与示例在 SwiftUI 中,有多种方式可以实现视图之间的导航。本文将比较 NavigationLink、navigationDestination、NavigationView、NavigationStack 和 NavigationSplitView 的用法和特点,并提供示例代码。
NavigationLinkNavigationLink 是最常用的导航方式,适用于简单直接的导航场景,如列表中导航到详情页面。
1234567891011121314151617181920212223242526import SwiftUIstruct ContentView: View { var body: some View { NavigationView { VStack { ...
ImageMagick 简介
ImageMagick 简介ImageMagick 是一个强大的开源工具,可以用于创建、编辑、合成和转换图像。它支持多种图像格式(如 PNG、JPEG、GIF、TIFF 等),并提供丰富的命令行工具和编程接口。
安装 ImageMagick在 macOS 上安装
使用 Homebrew(推荐):
1brew install imagemagick
如果需要使用 HDRI 或其他功能,可以添加选项:
1brew install imagemagick --with-hdri
验证安装:
1magick -version
输出版本信息即表示安装成功。
ImageMagick 的主要用法基本命令
查看图像信息
1magick identify image.png
显示图像的详细信息(格式、大小、颜色模式等)。
格式转换 将 PNG 转换为 JPEG:
1magick input.png output.jpg
调整图像大小 按指定尺寸调整大小:
1magick input.png -resize 200x200 output.png
按比例调整(例如 50% 大小):
1ma ...
崩溃日志的捕获和保存
在iOS应用程序开发中,处理崩溃是一个重要的话题。能够捕获、保存并上传崩溃日志不仅可以帮助开发者快速定位和修复问题,还能提高应用程序的整体质量和用户体验。本文将介绍如何在iOS应用中实现崩溃日志的捕获、保存和上传功能。
1. 捕获崩溃信息首先,我们需要设置一个未捕获异常处理程序来捕获崩溃信息。这可以通过使用NSSetUncaughtExceptionHandler()函数来实现。
12345678910111213141516171819void uncaughtExceptionHandler(NSException *exception) { NSArray *callStack = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSMutableDictionary *crashInfo = [NSMutableDictionary dictionary]; [crashI ...
SwiftData详解
以下内容已整理到小册子中,小册子代码在 Github 上,本文会随着系统更新和我更多的实践而新增和更新,你可以下载“戴铭的开发小册子”应用,来跟踪查看本文内容新增和更新。
小册子代码里有大量 SwiftData 实际使用实践的代码。
本文属于小册子系列中的一篇,已发布系列文章有:
【本篇】小册子之如何使用 SwiftData 开发 SwiftUI 应用
小册子之简说 Widget 小组件
小册子之 List、Lazy 容器、ScrollView、Grid 和 Table 数据集合 SwiftUI 视图
小册子之详说 Navigation、ViewThatFits、Layout 协议等布局 SwiftUI 组件
小册子之 Form、Picker、Toggle、Slider 和 Stepper 表单相关 SwiftUI 视图
小册子之 SwiftUI 动画
在 Swift 中,有许多库可以用于处理数据,包括但不限于 SwiftData、CoreData、Realm、SQLite.swift 等。这些库各有优势。
但,如果使用 SwiftData,你可以在 Swift 中更加方便地处理数 ...
combine学习
Swift Combine - iOS 13轉移到 Combine
先做一個公用程式,印出範例用…
其實,Combine的功能有很大一部分是用到Result<Value, Error>的設定,成功和失敗二擇一的參數應用…
Combine也是有所謂的生命週期
當然RxJS Marbles的彈珠圖也是可以參考的…
1234public func example(of description: String, action: () -> Void) { print("\n=== 範例: \(description) ===") action()}
Lesson.01 - Notification vs Combine通知 - Notification
先以一個iOS基本的Notification為基準
12345678910example(of: "Notification") { let myNotification = Notification.Name(" ...
DNS 域名解析
一、应用层的常用协议
超文本传输:http,https
文件传输:FTP
电子邮件:SMPT、POP3、IMAP
动态主机配置:DHCP
域名系统:DNS
二、域名由于IP地址不方便记忆,并且不能表达组织的名称和性质,人们设计出了域名。但实际上,为了能够访问到具体的主机,最终还是得知道目标主机的IP地址
域名根据级别分为顶级域名、二级域名、三级域名等
0.根域名根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其IP地址。因特网上共有13个不同IP地址的根域名服务器。当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个DNS客户最近的一个根域名服务器。这就加快了DNS的查询过程,同时也更合理地利用了因特网的资源。
1.顶级域名
通用顶级域名
.com 公司
.net, 网络
.org 组织机构
.edu 教育
.gov 政府部门
国家及地区顶级域名
.cn 中国
.jp 日本
2.二级域名二级域名是指顶级域名之下的域名
在通用顶级域名下,它一般指域名注册人的名称,例如google、baidu、micro ...
iOS Widget(3):App与Widget数据共享
一、引言 Widget是一个迷你版的App,iOS有沙盒机制,不同App之间无法直接共享数据。组件和主App之间其实就是不同App的关系,所以也无法通过userdefaults.standard来传数据,苹果为了在不打破沙盒的前提下能够传数据,就想出了App Group的方法。
二、数据共享方式 可以通过网络和本地数据两种方式进行数据的共享,本地数据共享可以通过 App Groups。
四、App Groups 原理 它是 iOS 8 之后推出的在 App 之间共享数据的方式,只需要简单的配置就可以实现数据的共享。它主要用于同一group下的app共享同一份读写空间,以实现数据共享。编码 App Groups只能异步同步数据,当Widget读取数据的时候,只能读之前手机App保存的数据,相反也是如此。当手机App有新的数据保存时,不能及时的通知Widget更新数据,只能是Widget下次去主动获取数据。
五、配置证书 由于widget项目和主项目其实是两个独立的appID,因为需要单独给widget配置证书,配置证书的过程参考APP证书配置;
开启APP Groups 开 ...
iOS Widget(2):小组件刷新机制
引言 前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制。
大纲
系统如何管理小组件刷新
Timeline刷新机制
Timeline刷新机制代码实现
刷新策略建议
时钟刷新策略(只有小时分钟,没有秒)
主动请求重新刷新
系统如何管理小组件刷新
WidgetKit在一个单独的进程中渲染小组件视图
即使小组件窗口显示在屏幕上,widget extension 也不会持续处于活动状态
为了管理系统负载,WidgetKit使用预算来分配一天中的窗口小组件重载
WidgetKit为用户添加到其设备的每个活动小组件维护不同的预算
每日预算通常包括40到70次刷新。该速率大致可转换为小组件每15至60分钟重新加载一次,但是由于涉及到许多因素,因此这些时间间隔是不固定的。
综上所述,小组件的刷不能由开发者自由控制,官方建议如下:
如果您的小组件可以预测应重新加载的时间点,则最好的方法是为尽可能多的将来日期生成时间线。
时间轴中的条目间隔应保持尽可能大。
时间轴应创建至少相隔5分钟的时间轴条目。
WidgetKit可能会在多个窗口小 ...
iOS Widget(1):小组件框架解析
引言 看了小组件的概述,你肯定想马上搞一个小组件出来试试,实践中学习效果更佳
本文大纲
创建小组件
认识小组件框架各个组成部分
创建小组件
第一步:先创建好一个App,步骤省略
第二步:在App中创建小组件 1. 在Xcode中打开您的应用程序项目,然后选择 File > New > Target。 2. 从“Application Extension”组中,选择“Widget Extension”,然后单击“Next”。 3. 输入小组件的名称。 4. 如果需要给小组件提供用户可配置的属性,请选中“Include Configuration Intent”复选框。 5. 单击 Finish。
认识小组件框架各个组成部分 如果没有勾选“Include Configuration Intent”,默认生成如下代码,这里新建的时候小组件的名字是 “Widget1”
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555 ...
XCode14.3打包错误
在有pods的项目中,xcode14.3之后打包出现如下错误
1command phasescriptexecution failed with a nonzero exit code
原因及解决方法如下
There is an issue with Cocoapods now, because Xcode 14.3 is now using a relative path in its symlink for frameworks.
Either wait for release of Cocoapods version 1.12.1 or make this simple change in your Pods-APPNAME-frameworks.sh file:
Replace:
1234if [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink "${source}")" ...