在使用Swift中的Textfield从Table View查看控制器时出错

时间:2015-05-27 20:40:17

标签: ios uitableview swift tableview sigabrt

好的,让我解释一下我的问题。在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。就我而言,我已经做了其他一切。

1 个答案:

答案 0 :(得分:2)

你的文字说你已经在你的故事板中创建了UIViewController,并为它添加了一个UITableView(如果我正确地阅读它)。但是您的TableViewControllerUITableViewController子类,而不是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”。

相关问题