Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从Swift中的Textfield切换到具有表视图的控制器时出错_Ios_Uitableview_Swift_Tableview_Sigabrt - Fatal编程技术网

Ios 从Swift中的Textfield切换到具有表视图的控制器时出错

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

好吧,让我解释一下我的问题。在main.storyboard中,我创建了一个新的tableView控制器,并在顶部添加了一个导航栏。我创建了新tableView控制器的segue,一切都很好。问题是在表格中滚动时导航栏没有停留在顶部。大多数人说,在搜索互联网后,只需创建一个普通的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.
}


}
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来克服它。非常感谢您的帮助!感谢您对代码其余部分的建议!