如何在 TableViewController 的 TableView 上方添加 TextField

问题描述

我有一个嵌入在 NavigationController 中的 TableViewController。该应用程序在这一点上运行良好。但现在我想在 TableView 上方添加一个 TextField:

Want a TextField added above the TableView

但我似乎无法从对象库上方拖动一个 TextField 到 TableView。它将它放到导航项上,但这不是我想要的。我尝试添加一个新的 ViewController,向其中添加一个 TextField,并尝试将 TableView 从我现有的 TableViewController 拖到它上面,但这是不可能的。通过采用现有 UI 元素并将其嵌入其他视图并仍保留现有功能来重新设计现有应用的正确方法是什么?

解决方法

通过将 UITextField 拖到那里,您正在尝试向 UITableViewControllerUIViewController 添加两个视图。 UIViewController(或UITableViewController)只有一个视图,然后该视图可以有多个子视图。所以这可能就是为什么在您尝试时拖放不起作用的原因,您基本上是在尝试直接向视图控制器添加多个视图,而不是添加 UIView 的子视图。

但是您可能不想仅仅将 UITextField 嵌入为表格视图的某个任意子视图,即使这在理论上是可能的。在这种情况下,它可能会漂浮在某处或出现在屏幕中间。 您可能想要做的是将 UITextField 嵌入到表格视图单元格 (UITableViewCell) 中,以便您可以在该表格视图单元格中输入一些文本。

有一些关于如何将 UITextField 嵌入表格视图单元格的教程和其他 answers on StackOverflow

,

我没有试图弄乱 StoryBoard 中的对象,而是这样做了:

  1. 删除了故事板中的所有对象。所以基本上我丢弃了 TableViewController。

  2. 添加了一个普通的 ViewController。

  3. 将 TextField 添加到 ViewController 的顶部。

  4. 在 TextField 下方的 ViewController 中添加了 TableView。

  5. 排列并添加了约束。

  6. 更改了现有的 ViewController.swift 类标题:

     class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate {
    
  7. 按住 Ctrl 键从 TableView 中拖动一个 IBOutlet:

     @IBOutlet weak var tblView: UITableView!
    

    因此,通过这样做,我可以将大部分代码保留在 ViewController.swift 中。

  8. 设置委托和数据源:

     tblView.delegate = self
     tblView.dataSource = self
     textField.delegate = self
    
  9. 遵守 TableViewDelegate 协议的方法现在失去了 override 说明符,例如:

     func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
         return 1
     }