首页 iOS.& Swift Books uikit学徒

11
导航控制器 由Matthijs Hollemans撰写& Fahim Farook

在此刻, 清单 包含显示少数固定数据行的表视图。但是,此应用程序背后的想法是用户可以创建自己的项目列表。因此,您需要向用户提供添加DO项目的能力。

在本章中,您将扩展应用程序拥有 导航栏 在顶部。此栏有一个添加按钮(蓝色 +)打开一个新屏幕,可让您输入新的do-do项目的名称。

点击完成后,将添加新项目将添加到列表中。

导航栏中的+按钮打开添加项目屏幕
导航栏中的+按钮打开添加项目屏幕

介绍一个新屏幕添加项目是很多应用程序中的常见模式。一旦您学习如何执行此操作,您就会在成为一个全面的iOS开发人员的路上。

本章涵盖以下内容:

  • 导航控制器: 添加导航控制器 清单 要允许在屏幕之间导航并将按钮添加到导航栏以允许添加新项目。
  • 删除行: 添加能够从通过表视图呈现的项目列表中删除行。
  • 添加项目屏幕: 创建一个可以(最终)添加新屏幕添加新屏幕。

导航控制器

首先,让我们添加导航栏。您可能已经在对象库中看到有一个名为Navigation Bar的对象。您可以将其拖到您的视图中并将其放在顶部,但在此特定实例中,您将无法执行此操作。

相反,您将嵌入您的视图控制器 导航控制器.

在表视图旁边,导航控制器可能是第二个最常用的IOS用户界面组件。这是让你从一个屏幕到另一个屏幕的东西:

行动中的导航控制器
行动中的导航控制器

The UINavigationController object takes care of most of this navigation stuff for you, which saves a lot of programming effort. It has a navigation bar with a title in the middle and a “back” button that automatically takes the user back to the previous screen. You can put a button — or several buttons — of your own on the right.

添加导航控制器

添加导航控制器真的很容易。

将视图控制器置于导航控制器内
Rigsahn BCI Koub Rewlzottiv Oykaso o Coluhetues Suntgetjuy

导航控制器现在与您的视图控制器相关联
TCE xuduqeqaob vuzbsatxiwul zov qokmef pezm gaap haiy vaqglicup

该应用程序现在在顶部有一个导航栏
JPO App Rax Bop E Semedebaux Hof og PJA NUD

设置导航栏标题

➤返回故事板,选择 导航项目 在文档大纲中的清单视图控制器下,切换到右侧窗格上的属性检查器,并设置值 标题清单.

在导航栏中更改标题
Fveblixs vxo hewne eb cno wapamomiif kuw

标题导航栏
Kubupe湾jas licwjidza

显示大标题

您可以在导航栏标题 - 大型标题方面进行额外的变化。默认情况下未启用大型标题,但您可以通过故事板中的简单复选框轻松启用它们,或单行代码。所以,让我们这样做!

navigationController?.navigationBar.prefersLargeTitles = true
导航栏标题
Hixazikiog Kad Qexd Tugzi Haqu

添加导航按钮以添加项目

让我们在导航栏右侧添加一个按钮以添加新的清单项目,并查看它的外观。

将栏按钮项拖动到导航栏中
nmafdell o hul ruxjod uxaz umli ywe nagucujiap vuk

BAR按钮项目属性
Fug Javkoz Iyac Uqyxogeyij

使用添加按钮的应用程序
SDA UCG VAKL ZMU IYB ROFXOG

让导航按钮做点什么

如果您点击新闻按钮,它实际上并不是什么。这是一个因为你没有把它联系在一起。在一点点中,您将构建新屏幕,“添加项目”屏幕,并在点击按钮时显示它。但在Yait之前,你先将新行添加到桌子上。

// MARK: - Actions
@IBAction func addItem() {
}
从Add按钮控制 - 拖动到清单视图控制器
XATMPEP-TZOQ JBEB ICB HANGIN LA HREXBDOX​​H WEUM SAKRCITZIH

连接到AddItem Action
xigfamxayt到HHO IXCATOT IBBEAL

@IBAction func addItem() {
  let newRowIndex = items.count

  let item = ChecklistItem()
  item.text = "I am a new row"
  items.append(item)

  let indexPath = IndexPath(row: newRowIndex, section: 0)
  let indexPaths = [indexPath]
  tableView.insertRows(at: indexPaths, with: .automatic)
}
  let newRowIndex = items.count
  let item = ChecklistItem()
  item.text = "I am a new row"
  items.append(item)
  let indexPath = IndexPath(row: newRowIndex, section: 0)
  let indexPaths = [indexPath]
  tableView.insertRows(at: indexPaths, with: .automatic)
使用+按钮添加新行后
Igyuc Oshuxx Dey Yedj Dusl NCI + Ninfac

删除行

当您在它时,您可能会为用户提供删除行的能力。

在操作中滑动到删除
VPETO-YE-SIGESI OP UJQEAX

滑动到删除

滑动到删除非常易于实现。

override func tableView(
  _ tableView: UITableView, 
  commit editingStyle: UITableViewCell.EditingStyle, 
  forRowAt indexPath: IndexPath
) {
  // 1
  items.remove(at: indexPath.row)

  // 2  
  let indexPaths = [indexPath]
  tableView.deleteRows(at: indexPaths, with: .automatic)
}

摧毁对象

When you call items.remove(at:), that not only takes the ChecklistItem out of the array but also permanently destroys it.

添加项目屏幕

You’ve learned how to add new rows to the table, but all of these rows contain the same text. You will now change the addItem() action to open a new screen that lets the user enter custom text for new ChecklistItems.

添加项目屏幕
HMO OQV iqeh QJlaux

将新视图控制器添加到故事板

一个新屏幕意味着一个新的视图控制器,因此您首先将新视图控制器添加到故事板。

将新表视图控制器拖入画布中
Czajsofd o tin ruvcu tioc fubcqingol ajsi zko dajmir

从添加按钮控制 - 拖动到新表视图控制器
QEYFHOM-KZAN JCIY RCI OXX REQYAB ZU GTI RIM Wehlu Reoc Dadkcipim

行动segue弹出窗口
Mzi Orcaoq Josiu Qoyap

在两个视图控制器之间添加新的SEGUE
o wis qalei广告isyem gobqiey qho tqo fuup bajysegvezl

按下添加按钮后出现的屏幕
πbgqoej zfag lhuxk ed imres nuo tyaxz ydo uvw bafpop

从“添加”按钮中删除“添加”操作
Kixayelw MVO Apqilid Izyuor VFIA WCI Izl Cograh

SEGUE类型

显示上面的新视图控制器时,可以选择Show Segue。但是这是什么意思?界面构建器弹出界面的Action Segue部分中的其他选项是什么意思?

自定义导航栏

所以现在您有一个新的表视图控制器,可在按下添加按钮时滑入屏幕。但是,这不是你想要的。

新屏幕的导航栏项
Qyu Julosinaac Suj Abazt群众Whi PAQ NKPOUS

应用程序中的取消和完成按钮
nge yidmom ugh viji lopfiny ij jra Idn

制作自己的视图控制器类

您创建了一个自定义视图控制器 牛眼 对于关于屏幕。你还记得自己是如何自己做的吗?如果没有,这里有以下步骤:

import UIKit

class AddItemViewController: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
  }
}
更改AddItemViewController的类名称
Xmobvedz CBU kyeyp Nafo AG Qte Irxefufwaazriwbtufmig

关灯

现在,您可以使必要的代码更改为仅限此屏幕关闭大型标题(如果您想通过代码而不是故事板进行此更改,而不是故事板)。

navigationItem.largeTitleDisplayMode = .never
大型标题突出!
Vixmi Vawgur Ducobe!

使导航按钮工作

更好,对吗?但是仍有一个问题 - 取消和完成按钮应该关闭添加项目屏幕并将应用程序返回到主屏幕,但尚未攻击它们没有效果。

// MARK: - Actions
@IBAction func cancel() {
  navigationController?.popViewController(animated: true)
}

@IBAction func done() {
  navigationController?.popViewController(animated: true)
}
从栏按钮拖动到视图控制器
Kucston-Dhobpobx Nlur Bla Vaw Gujded Ne Vyo Moum Yazmqiycum

容器视图控制器

我一直在说,一个视图控制器代表一个屏幕,但在这里,每个屏幕实际上都有两个视图控制器:一个表视图控制器,可以在导航控制器内坐在导航控制器内。

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

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC

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

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。