好的,让我解释一下我的问题。在main.storyboard中,我创建了一个新的tableView控制器,并在顶部添加了一个导航栏。我创建了segue到新的tableView控制器,一切正常。问题是当滚动表格时导航栏不会保持在顶部。搜索互联网后,大多数人说,只需创建一个普通的ViewController并添加一个表格视图,然后添加导航栏等。所以我这样做了,但现在,当你按下文本字段时,应用程序只是崩溃,并显示:
Thread 1: signal SIGABRT next to the line: class AppDelegate:
UIResponder, UIApplicationDelegate.
我无法弄明白为什么会这样,而且我是swift和代码的新手,所以想知道我是否是错误的人。为了测试我的代码中的问题是否排在其他地方,我创建了一个全新的Xcode项目来重新创建这个场景。但是我遇到了完全相同的错误,这让我认为它不是我的其余代码。
所以,这是我的新基本Xcode项目代码,以显示我想要做的事情。
查看控制器:
Import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
func textFieldDidBeginEditing(textField: UITextField) {
performSegueWithIdentifier("countryTableView", sender: self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
TableViewController :
import UIKit
class TableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var countryPicker = ["Uk", "Germany", "Colombia", "Spain"]
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
return countryPicker.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
cell.textLabel!.text = countryPicker[indexPath.row]
return cell
}
}
我已将表View的数据源和委托链接到View Controller。就我而言,我已经做了其他一切。
答案 0 :(得分:2)
你的文字说你已经在你的故事板中创建了UIViewController,并为它添加了一个UITableView(如果我正确地阅读它)。但是您的TableViewController
是UITableViewController
子类,而不是UIViewController
子类。这可能是事故的原因。
将超类更改为UIViewController
并添加UITableView
IBOutlet
:
@IBOutlet private weak var tableView: UITableView!
不要忘记在故事板中将其连线。
此外,一些代码清理可能会有所帮助......
不要在代码中分配textField
的委托。在Interface Builder中执行此操作。代码越少越好。
接下来,删除所有-didReceiveMemoryWarning
代码。你没有使用它,所以它只是让你的代码变得混乱,而且这里的问题很混乱。
每当您看到一个方法的模式只是调用super时,可以安全地删除它,并且不会影响该行为。例如,您也可以在-viewDidLoad
类的TableViewController
方法中将其删除。
删除这些评论:
// #warning Incomplete method implementation.
// Return the number of rows in the section.
这是来自Xcode的模板。这是为了帮助你,但不要在你的代码中留下垃圾。而且,它在Stack Overflow上没用。
让我们修复您的-tableView:cellForRowAtIndexPath:
电话。这不对。你每次都要创建一个新的细胞,而不是重复使用细胞。这样做:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("UITableViewCell") as! UITableViewCell
cell.textLabel!.text = countryPicker[indexPath.row]
return cell
}
确保故事板中的表视图中有原型单元格。它应该是UITableViewCell
类型,并且标识符为“UITableViewCell”。