Ios 从Swift中的Textfield切换到具有表视图的控制器时出错
好吧,让我解释一下我的问题。在main.storyboard中,我创建了一个新的tableView控制器,并在顶部添加了一个导航栏。我创建了新tableView控制器的segue,一切都很好。问题是在表格中滚动时导航栏没有停留在顶部。大多数人说,在搜索互联网后,只需创建一个普通的ViewController并向其添加一个表视图,然后添加导航栏等。所以我这样做了,但现在,每当你按下文本字段时,应用程序就会崩溃,并显示:Ios 从Swift中的Textfield切换到具有表视图的控制器时出错,ios,uitableview,swift,tableview,sigabrt,Ios,Uitableview,Swift,Tableview,Sigabrt,好吧,让我解释一下我的问题。在main.storyboard中,我创建了一个新的tableView控制器,并在顶部添加了一个导航栏。我创建了新tableView控制器的segue,一切都很好。问题是在表格中滚动时导航栏没有停留在顶部。大多数人说,在搜索互联网后,只需创建一个普通的ViewController并向其添加一个表视图,然后添加导航栏等。所以我这样做了,但现在,每当你按下文本字段时,应用程序就会崩溃,并显示: Thread 1: signal SIGABRT next to the li
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.
}
}
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
}
}
TableViewController:
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.
}
}
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
}
}
我已经将表视图的数据源和委托链接到视图控制器。就我而言,我已经做了所有其他的事情。你的文章说你已经在情节提要中创建了UIViewController,并在其中添加了UITableView(如果我读得正确的话)。但是您的
TableViewController
是UITableViewController
子类,而不是UIViewController
子类。这可能是坠机的原因
将超类更改为UIViewController
,并添加UITableView
IBOutlet
:
@IBOutlet private weak var tableView: UITableView!
别忘了在故事板上把它连接起来
另外,一些代码清理可能会有帮助
不要在代码中指定
textField
的委托。在Interface Builder中执行此操作。代码越少越好
接下来,删除所有
-didReceiveMemoryWarning
代码。你没有使用它,所以它只是把你的代码弄乱了,把你的问题弄乱了
只要您看到一个方法的这种模式只是调用super,它就可以被安全地删除,并且行为不会受到影响。例如,您还可以在TableViewController
类的-viewDidLoad
方法中删除它
删除以下评论:
// #warning Incomplete method implementation.
// Return the number of rows in the section.
这是Xcode的模板。这是为了帮助您,但不要在代码中留下垃圾。再说一次,它在这里对堆栈溢出没有用处
让我们修复您的
-tableView:cellforrowatinexpath:
调用。这不对。你每次都在创建一个新的单元格,而不是重复使用单元格。改为这样做:
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”
您在此处发布的代码没有问题。我认为在故事板中有UIViewController,并且分配给它的类是UITableViewController。是这样吗?你在用导航控制器吗?@MAbdulSami是的,就是这样。不,我没有使用导航控制器。您需要在情节提要中将UIViewController类分配给UIViewController。然后在分配的UIViewController类中添加UITableViewDataSource和UITableViewDelegate的协议。然后还要为类创建一个新的tableView引用出口(即ctrl+从故事板拖动)。并且您应该使用导航控制器,这样您就不会对导航barThanks产生问题,这一切似乎都起到了作用!它所做的唯一一件事是,当我按下文本字段时,它会显示键盘,然后切换到tableView。我怎样才能阻止它?我希望它直接进入tableView控制器。ThanksIt这样做是因为触摸文本字段通常允许您在字段中输入文本。你所做的并不是用户所期望的。但是,您可以通过从-textFieldShouldBeginEditing:delegate方法返回false并在那里执行segue来克服它。非常感谢您的帮助!感谢您对代码其余部分的建议!