我们在通过struct使用Codable的时候,是有默认实现的。但是如果class,就会麻烦一些。需要创建init函数。如果还要使用@Observable/ObservableObject,那就会更麻烦了。因为@Observable/ObservableObject会自动生成带_(下划线)的内部属性。这在解码的时候会报错。
此时就只能完全手写Codable才可以了。
我们在通过struct使用Codable的时候,是有默认实现的。但是如果class,就会麻烦一些。需要创建init函数。如果还要使用@Observable/ObservableObject,那就会更麻烦了。因为@Observable/ObservableObject会自动生成带_(下划线)的内部属性。这在解码的时候会报错。
此时就只能完全手写Codable才可以了。
macOS中,默认List选中之后的背景是深蓝色。这会导致我的按钮变得不明显,我希望修改这个背景色。
询问AI,AI给我的反馈是通过background修改。但是通过background修改的背景色,会比系统自带的小一圈,十分丑陋。我再次询问AI,如果要修改系统的默认选中背景,要如何做。AI回答说,要修改那个很复杂。然后给了我一个错误的解法。
我只要换个AI来问。第二个AI给出的也是通过background修改。不过它在说思路的时候,应该是通过listRowBackground修改。于是我自己尝试用listRowBackground来修改。这次成功了。
.listRowBackground(selectedLanguage == locale ? Color.gray.opacity(0.15) : Color.clear)
当使用listRowBackground,List的选中就不要绑定selectedLanguage了。因为那样会导致.listRowBackground和高亮色被同时使用。
高亮色就是List选中的背景色的正式说法。
因为上面说的原因,我们需要手动指令selectedLanguage,可以通过点击或者onHover。看你的界面的需要。
SwiftUI大大简化了Combine的使用。比如在使用iCloud同步Core Data的时候,会有多个NSPersistentStoreRemoteChangeNotificationPostOptionKey
通知。这时如果我们如果要更新界面,就会导致界面会重复计算多次。
这时我们就可以使用Combine的debounce
方法。在SwiftUI中,只需要这样调用就可以了。
private let updateUIPublisher = NotificationCenter.default.publisher(for: .updateUI)
.debounce(for: 0.2, scheduler: RunLoop.main)
稍微记录一下Core Data端的准备代码。如果不设置,是不会获得通知的。
if let description = container.persistentStoreDescriptions.first {
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
reigsteriCloudCoreDataSyncing()
}
extension PersistenceController {
func reigsteriCloudCoreDataSyncing() {
NotificationCenter.default.addObserver(forName: .NSPersistentStoreRemoteChange, object: container.persistentStoreCoordinator, queue: nil) { _ in
DispatchQueue.main.async {
NotificationCenter.default.post(name: .updateUI, object: container.persistentStoreCoordinator)
}
}
}
}