首页 iOS.& Swift Books 通过教程催化剂

10
Barista培训:菜单栏 由Marin Bencevic撰写

欢迎来到Barista培训!在接下来的几篇章节中,您将了解在Catalyst应用程序中添加不同类型的栏,包括菜单栏,工具栏和支持触摸杆。在本章中,您将修剪Journalyst应用程序的默认菜单栏以删除一些不必要的项目。您还将添加要删除,共享和添加新条目的新项目。拿出你的豆子和你的花哨的时髦燕麦牛奶 - 现在是时候酿造了!

免费菜单栏

所有Catalyst应用程序都包括免费菜单栏。从提供的材料开辟起动项目并在麦斯斯上运行它。当您的应用处于活动状态时,您将在屏幕顶部看到其菜单栏。所有标准菜单都喜欢 文件, 编辑等于已经存在。

Apple有时会拨打菜单栏“主菜单”。这就是你应该如何考虑菜单栏中的行动。就像在视频游戏中一样,主菜单包括用户可以在您的应用程序内执行的一般操作。

你应该记住的一件事是菜单栏不是动态的。当应用程序启动时,它们是一次建造一次,并且在运行时在运行时永远不会更改。有关应用程序的特定部件相关的更多动态操作,请使用如第5章中所述的上下文菜单“添加一些上下文”。

The menu bar itself is a nested UIMenu instance. Each UIMenu can contain child menus and 命令。命令是您可以按下的按钮。它们可以启用或禁用,每个命令都可以指定键盘快捷键以更轻松地访问。

命令使用称为叫做的东西执行 响应链链.

响应链链

打开 编辑 菜单,你会注意到 , 复制粘贴 都灰暗。这是有道理的:选择了被选中,没有什么可以削减或复制。

超出默认菜单

您将首先修剪来自菜单栏的一些不必要的项目。菜单栏可以在接口构建器或代码中更改。在本节中,您将使用interface Builder和稍后在本章中使用interface Builder,您将学习如何在代码中执行相同。

删除参赛作品

早在 main.storyboard., 选择 Item 2 在您之前添加的文件子菜单中。在属性检查员中,更改其 标题删除条目 并设置了 钥匙等价物shift-command-backspace.

@IBAction func deleteEntry(_ sender: Any) {
  guard let selectedIndexPath = 
    mainViewController?.tableView.indexPathForSelectedRow else {
      return
  }
  
  DataService.shared.removeEntry(atIndex: selectedIndexPath.row)
  if DataService.shared.allEntries.isEmpty {
    DataService.shared.addEntry(Entry())
  }
  mainViewController?.showEntry(
    at: IndexPath(row: 0, section: 0))
}

// 1
override func validate(_ command: UICommand) {
  // 2
  switch command.action {
  case #selector(deleteEntry):
    // 3
    if let selectedIndexPath = 
      mainViewController?.tableView.indexPathForSelectedRow {
      let entry = 
        DataService.shared.allEntries[selectedIndexPath.row]
      command.title= "Delete \(title(for: entry))"
    } else {
      // 4
      command.title= "删除条目"
    }
  default:
    break
  }
}

分享参赛作品

The menu bar is only one of the potentially many menus you can have in your app. Each UIResponder can add or remove items from their menus. The responder that’s responsible for the menu bar is the application itself, or in other words, the app delegate.

override func buildMenu(with builder: UIMenuBuilder) {
}
guard builder.system == .main else { return }
let shareCommand = UIKeyCommand(
  title: "Share",
  action: #selector(RootSplitViewController.share),
  input: "s",
  modifierFlags: [.command])
let shareMenu = UIMenu(
  title: "",
  options: [.displayInline],
  children: [shareCommand])
builder.insertChild(shareMenu, atStartOfMenu: .file)

case #selector(share):
  if (entryViewController?.entry?.log ?? "").isEmpty {
    command.attributes = [.disabled]
  } else {
    command.attributes = []
  }

关键点

  • Catalyst应用程序包括免费菜单栏。
  • 菜单栏由嵌套组成 菜单 其中包含 命令.
  • 每个命令都有一个 选择器 按下时调用,并使用它 响应链链 启用和禁用自己。
  • 您通过拖动通过菜单栏添加或删除项目 主菜单 到您的应用程序的故事板。
  • You can make the same changes in code by overriding buildMenu in the app delegate.
  • Override validate in a UIResponder subclass to change the appearance of a command.

然后去哪儿?

人类界面指南菜单部分(//apple.co/2YvlNH9)具有要考虑的菜单栏的操作的有用提示以及将覆盖的位置。

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您有关于UI,UX的反馈,请高在线到设计团队:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在这里拥有订阅或本身订阅的书。