在 macOS 应用程序的 SwiftUI 侧边栏中实现重命名和重新排序

问题描述 投票:0回答:1

我正在仅使用 SwiftUI 开发 macOS 应用程序。我正在尝试实现一个类似于 Finder 或 Notes 等原生 Apple 应用程序中的侧边栏,其中可以重新排列和重命名项目。

在我的侧边栏中,每个项目都是一个包含 TextField 的 NavigationLink。我已经成功复制了本机应用程序中看到的以下行为:

  1. 当某个项目处于活动状态时,单击该项目名称一次可以将其重命名。
  2. 当某个项目处于活动状态时,按 Return 键可以对其进行重命名。

但是,重新排列项目后,使用 Return 键重命名项目的功能(行为 2)将停止工作。

鉴于这些是 Mac 应用程序中的基本 UI 行为,我相信它们应该很容易在 SwiftUI 中实现。但是,我找不到任何关于将 TextField 放置在 NavigationLink 中并使用 Return 键聚焦的官方文档(甚至在重新排列项目之前)。

有人对这个问题有什么见解或建议吗?

我使用以下代码构建了一个 SwiftUI 视图。

struct SidebarListView: View {
  var items: [Item]

  var body: some View {
    List {
      ForEach(self.items) { item in
        ItemView(item: item)
      }
      .onMove(perform: self.moveItem)
    }
  }

  // Additional code...
}
struct ItemView: View {
  var item: Item

  @State private var newTitle: String = ""

  var body: some View {
    NavigationLink {
      Text(self.item.title)
    } label: {
      Label {
        TextField(text: self.$newTitle) {}
          .onSubmit(self.renameItem)
      } icon: { Image(systemName: "folder") }
    }
  }

  // Additional code...
}
swift macos swiftui
1个回答
0
投票

尝试这种方法(假设 Item 是一个结构),使用绑定,例如:

SidebarListView

 @State private var items: [Item] = [...]

 ForEach($items) { $item in
     ItemView(item: $item)
 }

并在您的

ItemView
中声明:

@Binding var item: Item
© www.soinside.com 2019 - 2024. All rights reserved.