我目前正在开发一个应用程序,当按下一个按钮时,它会在按钮所在的那个上方以模态形式显示一个视图控制器。这可以正常工作并显示在正确的位置,但是,模态视图控制器包含一个UiTableView,它似乎出现在视图控制器的左上角,在我将其放置在情节提要板上的位置附近不存在。我尝试添加所有约束,如下图所示,但是没有运气。当我添加约束时,tableview根本不会出现。
希望我能走到尽头的时候有人可以帮忙。
谢谢 杰米
答案 0 :(得分:1)
好吧,好像您是使用情节提要建立UI的。没关系,但是您应该意识到还有另一种方式来创建UI元素(tableView,按钮等):以编程方式。
由于您使用的是故事板,因此您可能忘记了选中/取消选中其中的某些设置可能会导致您遇到的问题,而我可能无法轻松地诊断出您的问题。因此,我将向您展示如何以编程方式解决此问题。
以编程方式
您可以在要呈现的viewController中以编程方式设置tableView的约束。
因此,如果要显示的viewController称为viewController
,而tableView是tableView
,则应该具有以下内容:
class viewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
/* First, tell XCode that you want to manually set the tableView's constraints using AutoLayout */
tableView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(tableView)
/* setup constraints for your tableView */
tableView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
tableView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}
}
创建包含tableView的viewController的另一种(更容易的方法)是简单地使UITableViewController
而不是UIViewController
的viewController继承。这是一个巧妙的小继承技巧,可用于使代码更加简洁,并避免编写不需要编写的代码。如果您从UITableViewController
继承,则可以在viewController内部自动获得一个“免费” tableView,而无需创建一个新的:
class viewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
通常,如果我们仅打算在其中包含单个UI元素:tableView,则可以从UITableViewController
继承viewController。另一方面,如果我们想在viewController中拥有更复杂的布局(例如tableView仅占用viewController的一部分,而其余空间则由其他UI元素占用),那么我们可能希望拥有viewController继承自UIViewController
,然后在其中创建一个tableView(就像我向您展示的第一个示例一样)。
故事板
使用情节提要板时,首先要确保操作正确,就是要使用AutoLayout来设置tableView的约束。在 main.storyboard 中,转到要显示的视图,然后单击tableView。然后,将鼠标悬停在此处的“对齐”按钮上:
确保同时选中“水平放置在容器中”和“垂直放置在容器中”。这会将您的tableView置于其superView中。
然后,还修改以下内容:
确保已选中“约束到边距”选项。这将tableView的边距限制在其superView上(理想情况下)。