我有一个简单的主/细节界面,其中细节视图修改数组中的一个项目。使用以下内容,模型已正确更新,但 SwiftUI 不会刷新视图以反映更改。
模型:
struct ProduceItem: Identifiable {
let id = UUID()
let name: String
var inventory: Int
}
final class ItemStore: BindableObject {
var willChange = PassthroughSubject<Void, Never>()
var items: [ProduceItem] { willSet { willChange.send() } }
init(_ items: [ProduceItem]) {
self.items = items
}
}
Run Code Online (Sandbox Code Playgroud)
显示 ProduceItems 列表的主视图(一个 ItemStore 被插入到 SceneDelegate 的环境中):
struct ItemList: View {
@EnvironmentObject var itemStore: ItemStore
var body: some View {
NavigationView {
List(itemStore.items.indices) { index in
NavigationLink(destination: ItemDetail(item: self.$itemStore.items[index])) {
VStack(alignment: .leading) { …
Run Code Online (Sandbox Code Playgroud) 我有一个 NSTableView,它的第一行从顶部向下推 10 pt。标题被关闭,没有组行,单元格间距为 0,封闭滚动视图的内容插入为 0。
更新
这是一个演示该问题的示例项目。
这是视图层次结构调试器的抓图:
这是NSTableRowView
在视图层次结构调试器中暂停时第一行的垂直约束:
我尝试实现委托的tableView(_:didAdd:forRow:)并检查约束,首先使用约束AffectingLayout (for:):
[<NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500 (active)>]
Run Code Online (Sandbox Code Playgroud)
然后打印所有行视图的约束:
- 0 : <NSLayoutConstraint:0x60000390bcf0 'NSTableRowView_Encapsulated_Layout_Width' NSTableRowView:0x7fdb12e26eb0.width == 329 priority:500 (active)>
- 1 : <NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500 (active)>
- 2 : <NSAutoresizingMaskLayoutConstraint:0x60000390bbb0 h=--& v=-&- InlineCell.minX == 16 (active, names: InlineCell:0x7fdb12e283a0, '|':NSTableRowView:0x7fdb12e26eb0 )>
- 3 : <NSAutoresizingMaskLayoutConstraint:0x60000390bc00 h=--& v=-&- InlineCell.width == 297 (active, names: InlineCell:0x7fdb12e283a0 )>
- 4 …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 SwiftUI 的项目需要 CloudKit 共享,但我无法UICloudSharingController
在 SwiftUI 环境中正常运行。
第一个问题
直接UICloudSharingController
使用 using 会UIViewControllerRepresentable
产生一个无限的旋转器(请参阅此)。正如对其他系统控制器所做的那样UIActivityViewController
,我将其包装UICloudSharingController
在一个包含UIViewController
如下:
struct CloudSharingController: UIViewControllerRepresentable {
@EnvironmentObject var store: CloudStore
@Binding var isShowing: Bool
func makeUIViewController(context: Context) -> CloudControllerHost {
let host = CloudControllerHost()
host.rootRecord = store.noteRecord
host.container = store.container
return host
}
func updateUIViewController(_ host: CloudControllerHost, context: Context) {
if isShowing, host.isPresented == false {
host.share()
}
}
}
final class CloudControllerHost: UIViewController {
var rootRecord: …
Run Code Online (Sandbox Code Playgroud) 在 Big Sur 中,Xcode 和 Calendar 的工具栏项目在打开时保留在侧边栏上,但在侧边栏折叠时在左侧仍然可见。
在13:55 的“采用 macOS 的新外观”中,John 说“放置在分隔符 [sidebarTrackingSeparator] 之前的项目将出现在全高侧边栏上”,就像它们在 Xcode 和日历中一样。我一直无法完成这项工作。
这是一个演示该问题的示例项目。我使用了 IB 定义的“带有侧边栏的窗口控制器”,并添加了一个用于切换侧边栏的工具栏项。在 NSWindowController 的子类中,我.sidebarTrackingSeparator
在.toggleSidebar
项目后插入:
override func windowDidLoad() {
// Sometimes the toolbar items aren't loaded yet--async is a quick and dirty way to prevent a crash
DispatchQueue.main.async {
self.window?.toolbar?.insertItem(withItemIdentifier: .sidebarTrackingSeparator, at: 1)
}
}
Run Code Online (Sandbox Code Playgroud)
有时这不起作用(切换按钮保留在侧边栏的右侧)。有时侧边栏切换会放在溢出菜单中:
在 WWDC 会议之外,我还没有看到任何关于实现此工具栏设计的讨论。有没有人能够让这个工作?
在 macOS 上,SwiftUI 菜单按钮最初显示为禁用。一旦您单击它们,它们就会正常激活并正确显示。此代码复制了该问题:
Menu {
Button("First") { }
Button("Second") { }
} label: {
Image(systemName: "gearshape.fill")
}
.padding()
Run Code Online (Sandbox Code Playgroud)
最初看起来像这样:
然后点击按钮后:
.disabled(false)
尝试使用;明确地破坏禁用状态 没有快乐,因为它并没有真正被禁用我可以只设置图像的前景色,但我希望找出真正的问题。我错过了什么吗?
编辑:设置前景也不起作用。仍然明显残疾。
我正在尝试在适用于 iOS 的 SwiftUI 应用程序中实现撤消,但我无法使撤消手势起作用。这是一个演示问题的示例:
class Model: ObservableObject {
@Published var active = false
func registerUndo(_ newValue: Bool, in undoManager: UndoManager?) {
let oldValue = active
undoManager?.registerUndo(withTarget: self) { target in
target.active = oldValue
}
active = newValue
}
}
struct UndoTest: View {
@ObservedObject private var model = Model()
@Environment(\.undoManager) var undoManager
var body: some View {
VStack {
Toggle(isOn: Binding<Bool>(
get: { self.model.active },
set: { self.model.registerUndo($0, in: self.undoManager) }
)) {
Text("Toggle")
}
.frame(width: 120)
Button(action: { …
Run Code Online (Sandbox Code Playgroud) 我已经启动了一个新的 macOS 项目(目前在 Big Sur beta 3 上),节点NSOutlineView
似乎已损坏。分不清这是我还是操作系统。
这是一个演示该问题的示例项目。还有一个图像...
正如您所看到的,单元与扩展 V 形重叠。单击任一 V 形图标会将第一行恢复到正确的布局,但不会将第二行恢复到正确的布局。此外,自动保存方法persistentObjectForItem
和itemForPersistentObject
永远不会被调用。
测试项目非常简单——我所做的就是将SourceView
组件从视图库添加到默认应用程序项目,并将委托/数据源连接到视图控制器。还检查Autosave Expanded Items
了 IB 并在字段中输入了名称Autosave
。这是完整的控制器代码:
class ViewController: NSViewController {
@IBOutlet var outlineView: NSOutlineView?
let data = [Node("First item", 1), Node("Second item", 2)]
}
extension ViewController: NSOutlineViewDataSource {
func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
data[index]
}
func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
true …
Run Code Online (Sandbox Code Playgroud) 我有一个使用自调整表格视图单元格的项目。我想在单元格的高度发生变化时设置动画。NSTableViewnoteHeightOfRows(withIndexesChanged:)
将对基于视图的单元格执行此操作,但仅当在委托的tableView(_, heightOfRow:)
方法中明确提供高度时。使用自动布局计算单元格高度时,将忽略此值。
我可以让单元格视图本身进行动画处理,但它包含的行视图会跳转到由约束决定的最终大小。还尝试在行视图上使用高度约束并为其设置动画,但它也被忽略了。有人离开开发解决了这个问题的 Mac 应用程序吗?
macos ×5
swiftui ×4
appkit ×3
ios ×2
nstableview ×2
autolayout ×1
cocoa ×1
combine ×1
nstoolbar ×1
undo ×1