在 UITableViewController (Swift) 顶部添加按钮

Posted

技术标签:

【中文标题】在 UITableViewController (Swift) 顶部添加按钮【英文标题】:Add button on top of UITableViewController (Swift) 【发布时间】:2015-07-13 19:03:52 【问题描述】:

我正在尝试在 uitableview 控制器表视图的顶部添加一个按钮。视图控制器有一个导航控制器和静态单元格,这就是为什么它是一个 uitableviewcontroller 而不是一个 uiviewcontroller。现在我正在尝试在屏幕底部添加一个按钮,该按钮连接到导航控制器,这样它就不会随着表格视图滚动。

我正在尝试制作类似于下面的内容。它有一个用于顶部栏的导航控制器、一个带有静态单元格的表格视图,然后是一个按钮,但是它们是如何实现按钮的呢?

图片:http://postimg.org/image/ilsmqqrip/

谢谢!

更新:如何通过 Swift 将 uiviewcontroller 与带有静态单元格的 tableview 一起使用?

【问题讨论】:

【参考方案1】:

我发现 Container Views 在这种情况下非常有用!一个干净的解决方案,非常容易实施。

只需创建一个普通的 UIViewController,添加你的按钮和一个 ContainerView 作为这个 UIViewController 的子视图(下图中的中间)。最后从 ContainerView 创建 Embed Segue 到你的 UITableViewController(右边那个)。

这样您就可以使用静态单元格原型,而不仅限于同时使用 UITableView。

结果:

【讨论】:

我花了一段时间才弄清楚如何实现你的建议,但它确实更简单、更便携,不需要代码。 接受你如何显示导航栏...【参考方案2】:

对此有更好的解决方案。您可以通过禁用相应按钮的 Auto Layout(button.translatesAutoresizingMaskIntoConstraints = false) 属性或浮动按钮的任何 UIView 来做到这一点:

斯威夫特 4

//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(button)

//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(ios 11.0, *) 
     button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
 else 
     button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true

【讨论】:

你不能写“let button.frame.size = CGSize(width: 100, height: 50)”它应该是“button.frame.size = CGSize(width: 100, height: 50)”并将addSubview方法中的名称“nextButton”更改为按钮。【参考方案3】:

我对@9​​87654324@ 和一个静态数据源做了类似的事情。我在表格视图的页脚视图中添加了按钮。

为了使其与屏幕底部对齐,我需要在我的视图控制器中使用以下代码:

override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)

        // Make footerview so it fill up size of the screen
       // The button is aligned to bottom of the footerview 
       // using autolayout constraints
        self.tableView.tableFooterView = nil
        self.footerView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.tableView.frame.size.height - self.tableView.contentSize.height - self.footerView.frame.size.height)
        self.tableView.tableFooterView = self.footerView
    

简而言之,我调整页脚视图的大小以在删除表格视图的内容大小后占用所有剩余空间。由于该按钮使用自动布局对齐到 footerView 的底部,因此它将停留在屏幕底部。

故事板:

结果如下:

【讨论】:

你能告诉我如何快速做到这一点,因为我正在尝试这样做,但所有显示的是:postimg.org/image/pl81087ix 记得使用 IBOutlet 连接 footerView 谢谢,但现在当我将表格视图设置为“分组”时,我无法显示任何单元格。线条消失了,我看不到任何预定义的单元格。有什么帮助吗? 我认为您不必为此使用分组的表格视图。您甚至可以将 tableFooterView 添加到普通的 tableview。 没关系,我发现是因为我设置了一个空的视图控制器类。【参考方案4】:

UITableViewController 将占据整个空间,因此您将无法添加按钮。将基于 UITableViewController 的代码重构为 UIViewController 并手动添加 UITableView。这样您就可以设置表格视图的大小并将按钮放在底部。

【讨论】:

【参考方案5】:

不幸的是 UITableViewController 有一个 tableView 作为它的***视图。当然,如果您查看视图调试器,您可以看到 tableview 不是根视图。因此,您可以通过编程方式将按钮添加到 tableView 的窗口中。如果您必须事后进行,这可能是在 UITableViewController 上添加***元素的最简单方法。否则,如果您在初始设计中这样做,您可以为按钮使用容器视图,为 TableView 使用 UITableViewController。这种方法的缺点是您最终会得到两个视图控制器,一个用于容器,一个用于表,并且通常需要在它们之间传递信息。如果您使用 swift,您可以通过将 tableViewcontroller 嵌套在容器视图控制器类中来简化此操作。

如果你想在窗口中添加一个按钮,一旦你确定视图有一个窗口,你就可以懒惰地这样做。请注意,按钮属于窗口而不是视图控制器,因此您有责任在视图控制器消失时删除它们。

    private weak var button: UIButton!
    ...
    override func didMove(toParentViewController parent: UIViewController?) 
        super.didMove(toParentViewController: parent)
        guard self.button == nil, let window = tableView.window else 
            return
        
        let button = UIButton(frame: CGRect(x:0, y:40, width: 200, height: 20))
        button.setTitle("This is a red button", for: .normal)
        button.backgroundColor = UIColor.red
        window.addSubview(button)
        self.button = button
    

    override func viewWillDisappear(_ animated: Bool) 
        super.viewWillDisappear(animated)
        button?.removeFromSuperview()
    

【讨论】:

【参考方案6】:

第 1 步:-

拖拽一个uiview到UITable View Controller(静态) 它会自动粘在底部。

如果你需要,你也可以在UIView里面添加两个按钮...这取决于你的要求。

第 2 步:-

为uiview(outletView)连接outlet

第 3 步:-

在 View Will Appear 中添加以下代码。

override func viewWillAppear(_ animated: Bool) 

    outletViewBottom.backgroundColor = .red
    tableView.addSubview(outletViewBottom)

    // set position
    outletView.translatesAutoresizingMaskIntoConstraints = false
    outletView.leftAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.leftAnchor).isActive = true
    outletView.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor).isActive = true
    outletView.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor).isActive = true
    outletView.widthAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.widthAnchor).isActive = true
    outletView.heightAnchor.constraint(equalToConstant: 50).isActive = true // specify the height of the view


第四步:-

现在运行代码...快乐编码。

【讨论】:

【参考方案7】:

您需要做的就是将您的顶视图添加到navigationController.view,如下所示:

self.navigationController?.view.addSubview(YOUR_TOP_VIEW)

因此,如果您需要在不随 tableView 滚动的 TableViewController 之上的粘性按钮/视图等...,请使用此方法。

【讨论】:

【参考方案8】:

这是一个 UIViewController,添加了一个 UITableView 作为子视图。在右上角,您可以看到一个下拉菜单,其中显示内容:动态原型。将其更改为静态单元格。

【讨论】:

我认为这行不通,因为我需要使用 uitableviewcotroller,因为我需要静态单元格,而您无法使用 tableviewcontroller 更改它的高度。 您可以使用常规的 UIViewController 或 UINavigationController,并自己添加表格视图。这使它更加灵活。 这是我在所有应用程序中采用的方法。我使用 UIViewController,并将表格视图添加为子视图,因此我可以随意更改其大小。如果你想使用静态单元格,你仍然可以。 构建失败并给我一个错误提示“静态表视图仅在嵌入 UITableViewController 实例时才有效”。 dropbox.com/s/i2tj093a6nu01um/table%20view.zip?dl=0 我做了一个小示例项目。原来你必须将内容设置为“动态原型”,但如果你强制它们的高度,单元格无论如何都可以是静态的。您可以使用原型而无需对其进行自定义。

以上是关于在 UITableViewController (Swift) 顶部添加按钮的主要内容,如果未能解决你的问题,请参考以下文章

我想通过在 Swift 中以编程方式将 UINavigationController 与 UITableViewController 嵌入 UITableViewController 这是 UITab

在 UITableViewController 中没有调用 cellForRowAtIndex?

在导航栏中使用 UITableViewController

在 UITableViewController 之外使用 NSFetchedResultsController

在 UINavigationController 中显示 UITableViewController

在 UITableViewController 中设置导航栏颜色。