我希望包含一个带有自定义控件的 Swift 包的演示应用程序,该包显示每个控件的实现演示。有没有办法可以将其包含在 Swift 包中(并且还可以通过这种方式直接在包内开发/测试控件)?
我正在构建一个动画进度按钮,显示下载进度,然后在下载完成后展开以显示按钮文本(有点像 App Store 按钮)。
我有一个自定义按钮视图,它采用 @Binding 到外部进度 CGFloat 值。我知道我可以通过 init 设置视图的进度值,但这似乎并没有让我更接近。当然,进度在自定义按钮视图之外会发生变化。我希望能够让按钮自动处理进度值更改并在进度达到 1.0 时自动扩展。
我使用显式动画来为按钮形状设置动画(通过在 withAnimation 中包含几个私有 @State 属性更改)。问题是,当 @Binding 进度值更改时,我需要能够调用设置这些 @State 属性的代码。如果不在按钮视图之外发生显式的 withAnimation 调用,我看不到任何方法可以做到这一点。我不想使用隐式动画,因为当按钮的原点发生变化时,这会导致问题。我发现的演示都只是通过 .onTap 在按钮内设置状态。
理想情况下,有一种方法可以在 @Binding 值更改时调用函数。我见过一些关于使用发布商的内容,但这似乎有点矫枉过正?如果这是唯一的选择,那么我想知道我是否可以以某种方式在按钮视图内私下执行此操作,并且仍然将 $progress 传递给按钮(以获得最大的可重用性)?
如何使用@Binding-driven 控件构建动态列表而无需手动引用数组?看起来很明显,但是使用 List 或 ForEach 遍历数组会产生各种奇怪的错误。
struct OrderItem : Identifiable {
let id = UUID()
var label : String
var value : Bool = false
}
struct ContentView: View {
@State var items = [OrderItem(label: "Shirts"),
OrderItem(label: "Pants"),
OrderItem(label: "Socks")]
var body: some View {
NavigationView {
Form {
Section {
List {
Toggle(items[0].label, isOn: $items[0].value)
Toggle(items[1].label, isOn: $items[1].value)
Toggle(items[2].label, isOn: $items[2].value)
}
}
}.navigationBarTitle("Clothing")
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
...
Section {
List($items, id: \.id) { item in
Toggle(item.label, isOn: …Run Code Online (Sandbox Code Playgroud) 更新:我可以通过将 PNG 大小设置为超过任意值(即 700 x 700 pt 失败)来重现此问题。在任意值下写入和读取都很好。我不确定那条线到底在哪里。
我使用 zip 存档作为我的文档文件格式。当尝试从文件浏览器页面的多个存档中读取 PNG 预览时,我看到了意外的结果。
在后台查询文档 URL,然后创建文件数据对象。查询完成后,将在主线程上调用 UI 更新,并且文件数据对象充当集合视图的数据提供者。
PNG 被序列化为数据,如下所示:
let imageData = UIImagePNGRepresentation(image)
Run Code Online (Sandbox Code Playgroud)
读取数据时,相关条目被提取到内存中,然后反序列化为各自的对象。
我看到的是文档缩略图仅间歇性显示。ZIPFoundation 对于后台操作是否可能不是线程安全的?
我在一个更简单的测试项目中模拟了它,它工作得很好,但我没有阅读多个档案,也没有在后台调用它。我做错了什么吗(下面的代码)?
消费者闭包是否使用自己的线程(也许我在它完成之前返回数据)?
do {
let decoder = JSONDecoder()
let archive = Archive(url: URL, accessMode: .read)
// Metadata
if let metadataData = try archive?.readData(named: Document.MetadataFilename) {
self.metadata = try decoder.decode(Metadata.self, from: metadataData)
} else {
logDebug(self, "metadata not read")
}
// Preview
if let previewData = try archive?.readData(named: Document.PreviewFilename) {
if let image = UIImage(data: …Run Code Online (Sandbox Code Playgroud) 假设我有一个类似下面的模型,它允许我构建一个Foo对象树.
struct Foo {
var kind : Kind
enum Kind {
case node([Foo])
case leaf
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能制作这款Codable,专门用于case node([Foo])?
swift ×2
swiftui ×2
cocoa ×1
cocoa-touch ×1
codable ×1
combine ×1
ios ×1
swift4 ×1
swiftui-list ×1