小编smr*_*smr的帖子

SwiftUI @Binding 不刷新视图

我有一个简单的主/细节界面,其中细节视图修改数组中的一个项目。使用以下内容,模型已正确更新,但 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)

swiftui combine

10
推荐指数
1
解决办法
5416
查看次数

NSTableView 在第一行上方有不需要的空间

我有一个 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)

macos nstableview appkit macos-big-sur

9
推荐指数
1
解决办法
1296
查看次数

SwiftUI 和 UICloudSharingController 互相讨厌

我有一个使用 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)

ios swiftui

8
推荐指数
1
解决办法
1207
查看次数

侧栏中的 Big Sur 工具栏项目

在 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 appkit nstoolbar nstoolbaritem macos-big-sur

7
推荐指数
1
解决办法
2176
查看次数

SwiftUI 菜单按钮最初显示为禁用

在 macOS 上,SwiftUI 菜单按钮最初显示为禁用。一旦您单击它们,它们就会正常激活并正确显示。此代码复制了该问题:

Menu {
    Button("First") { }
    Button("Second") { }
} label: {
    Image(systemName: "gearshape.fill")
}
.padding()
Run Code Online (Sandbox Code Playgroud)

最初看起来像这样:

在此输入图像描述

然后点击按钮后:

在此输入图像描述

  • 预览显示正确,但正在运行的应用程序的行为如上
  • 菜单的内容似乎不影响结果
  • .disabled(false)尝试使用;明确地破坏禁用状态 没有快乐,因为它并没有真正被禁用

我可以只设置图像的前景色,但我希望找出真正的问题。我错过了什么吗?

编辑:设置前景也不起作用。仍然明显残疾。

macos swiftui

7
推荐指数
1
解决办法
1249
查看次数

SwiftUI 和三指撤销手势

我正在尝试在适用于 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)

undo ios swiftui

4
推荐指数
1
解决办法
1058
查看次数

大苏尔轮廓视图可扩展项目已损坏

我已经启动了一个新的 macOS 项目(目前在 Big Sur beta 3 上),节点NSOutlineView似乎已损坏。分不清这是我还是操作系统。

这是一个演示该问题的示例项目。还有一个图像...

在此输入图像描述

正如您所看到的,单元与扩展 V 形重叠。单击任一 V 形图标会将第一行恢复到正确的布局,但不会将第二行恢复到正确的布局。此外,自动保存方法persistentObjectForItemitemForPersistentObject永远不会被调用。

测试项目非常简单——我所做的就是将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)

macos nsoutlineview appkit macos-big-sur

3
推荐指数
1
解决办法
1247
查看次数

动画自调整 NSTableView 行高

我有一个使用自调整表格视图单元格的项目。我想在单元格的高度发生变化时设置动画。NSTableViewnoteHeightOfRows(withIndexesChanged:)将对基于视图的单元格执行此操作,但仅当在委托的tableView(_, heightOfRow:)方法中明确提供高度时。使用自动布局计算单元格高度时,将忽略此值。

我可以让单元格视图本身进行动画处理,但它包含的行视图会跳转到由约束决定的最终大小。还尝试在行视图上使用高度约束并为其设置动画,但它也被忽略了。有人离开开发解决了这个问题的 Mac 应用程序吗?

macos cocoa nstableview autolayout

2
推荐指数
1
解决办法
287
查看次数