Selection Range in SwiftUI

在 SwiftUI 中,没有提供默认的 modifier 来监听 TextViewselectionRange

这对于文本编辑类 app 来说是很致命的,因为无法控制光标的位置,

但是可以从其他的文章中找到一些思路:

寻找 NSView / UIView 的方法来源于:siteline/SwiftUI-Introspect

本文来介绍一种解决方案,可以实现出以下的代码:

1
2
3
4
5
6
7
8
9
10
11
import SwiftUI

struct Example: View {
@State private var selectionRange = NSRange()
@State private var text = ""

var body: some View {
TextEditor(text: $text)
.selectionRange($selectionRange)
}
}
阅读更多

MarkdownView 从 0 到 1 —— 回顾整条时间线

熟悉我的朋友应该知道,我一直在开发一个框架,

用于在 SwiftUI 中以原生的方式来渲染 Markdown 文本。

P.S. 这篇文章也是在我做的编辑器中完成的。

早晨发布了 MarkdownView1.0.0-rc,也就是正式版的候选版本,

写这篇文章主要是想回顾和总结一路过来的技术点和一些解决方案。

阅读更多

理解函数中的泛型 & 泛型约束 —— 究竟谁才是入口?

继续接上篇,做完 AnyMyCollection 之后,

我又添加了一个扩展来修改 CustomCollection 在特定类型下的行为:

1
2
3
4
5
extension CustomCollection where Element == Int {
func allValues() -> [Element] {
[4, 5, 6]
}
}

ElementInt 时,不管三七二十一,直接返回 [4, 5, 6]

但是,运行是发现了这样的现象:

1
2
3
4
5
let collection = CustomCollection(1, 2, 3)
print(collection.allValues()) // [4, 5, 6]

let any = AnyMyCollection(collection)
print(any.allValues()) // [1, 2, 3]
阅读更多
Swift 中的类型擦除(下)—— 从模仿中学习

Swift 中的类型擦除(下)—— 从模仿中学习

上篇博客中,我们初步了解了为什么需要一个 Type Eraser ,

也分享了一个简单实现 Type Erasure 的方案。

为了更加深入了解类型擦除,我们还是得来看看 Swift 自带的一些 Type Eraser 是如何实现的。

目标是:理解一下其基本思路,并且仿制一个出来。

阅读更多
Swift 中的类型擦除(上)—— 为什么 & 怎么做

SwiftUI 中的 Conditional Scene

在 SwiftUI 中,有时需要对新的 API 做隔离来保证兼容老的系统。

在 View 中很好解决,但是在 Scene 中,你可能会看到这样的错误提示。

Closure containing control flow statement cannot be used with result builder ‘SceneBuilder’

2023.2.17更新

在 Xcode 13.4 beta 中,SceneBuilder 支持了 buildExpressionbuildLimitedAvailabilitybuildOptional

阅读更多

macOS 开发 -- URL 访问权限持久化(基于 Sandbox)

好久不见,最近有在好好学习哈哈,

今天来分享下基于 Sandbox 的 URL 访问权限持久化的方案。

写这篇文章的起因是:

简单浏览了下 Tencent/lemon-cleaner 的部分源码,

发现他们用 Apple Script 调用 Finder 操作文件,

这样很好地避免了权限问题,但是研究一番发现,没那么简单….

阅读更多

记录下 MarkdownView 的性能优化

我的开源项目 MarkdownView 的 0.2.0 版本 终于发布了!

改版本带来了性能上的巨大进步:

Performance

  • Rendering is now at least 3x faster on ALL DEVICES.
  • Real-time previewing is now much much smoother.
  • Scrolling is much quicker and smoother with no frame drop.
  • Memory usage has been reduced by 30%

借此机会,记录下我的优化思路。

阅读更多