私は最初から別のViewControllerスウィフトSearchResultsControllerセグエ - 「レシーバーは...識別子とはセグエを持っていない 『testSeg』 '」
にsearchResultControllerからsegueing問題が生じています: 私は3つのコントローラ、とAのUIViewControllerを持っています内部に埋め込まれたCollectionViewとUISearchController、searchResultControllerとして機能するUITableViewController、およびクリックされたときに各tableviewセルが分割される最後のUIViewControllerがあります。 Here is an image of Main.Storyboard。 Here the segue with its identifier is shown, which is the problem。
セグエがSearchResultsTableViewController自体からリンクされている、いないtableviewcell 私は、検索結果をクリックすると、私はSearchResultsControllerでdidSelectRowAtIndexPathメソッドからそのセグエを行います。しかし、私は "Receiver ..."という識別子を持つセグを持っていません。 'testSeg' '"というエラーです。明確にするために
、コントローラの名前とその役割は以下のとおりです。
1)DiscoverViewControllerは:(含まUISearchControllerとCollectionView)
2)正しくフィルタリングし、任意のデータを更新searchResultsControllerとしてSearchResultsTableViewController(使徒各セルは、このコントローラからセグエになっている)
3)のUIViewController(セグエの宛先である単純なのUIViewController)
問題はセグーであり、他のすべては意図どおりに実行されます。これはSearchResultsTableViewControllerのコードです。
注:これは私がスウィフト2.3を使用して、これを試みたとにsearchResults配列がDiscoverViewControllerから来
private let reuseIdentifer = "searchCell"
class SearchResultsTableViewController: UITableViewController {
var searchResults: [String]!
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: reuseIdentifer)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return (searchResults?.count)!
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifer, for: indexPath)
// Configure the cell...
cell.textLabel?.text = searchResults[indexPath.item]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "testSeg", sender: self)
}
}
同じエラーを得たスウィフト3であるという事実を無視することができます。セグの場合を除いてすべてうまく動作します。行を選択すると、アプリはエラーでクラッシュします。
2016-10-07 12:17:51.216 MultiTestDemo[1028:10002] *** Terminating app
due to uncaught exception 'NSInvalidArgumentException', reason:
'Receiver (<MultiTestDemo.SearchResultsTableViewController:
0x7fea214055f0>) has no segue with identifier 'testSeg''
私は、セグ識別子にスペースや何もないことを確認しました。私はそれをSearchResultsTableViewControllerのdidselectrowatindexpath関数に直接コピーしました。
結論として、IBで接続したときに、SearchResultsTableViewControllerがsegue(または任意の識別子のセグ)を識別できなくなった理由についての助けとなります。どんな助けでも大歓迎です。
どのようにSearchResultsTableViewControllerをインスタンス化しますか? – pbasdf
あなたのGitHubリンクでそれを見つけました。この問題は、SearchResultsTableViewControllerをインスタンス化する方法に起因します。この行は: 'let searchResultsController = SearchResultsTableViewController()'はそれを作成しますが、ストーリーボードへの参照は一切ありません。したがって、ストーリーボードに定義されているセグエについては何も知りません。代わりに、UIStoryboardメソッド 'instantiateViewControllerWithIdentifier'(必要に応じてストーリーボード内に識別子を追加したもの)を使用する必要があります。 – pbasdf
これは間違いなく動作します。実際にこれを試してみましたが、searchREsultsControllerで繰り返しインスタンスを削除するまでクラッシュし続けました。答えてくれてありがとう。しかし、「帰り道」は存在しないようです。私はデモにナビゲーションコントローラがないことを認識していますが、ユーザーが検索結果にどのくらい戻ってくるのでしょうか?たとえば、これはユーザーの検索機能でしたか?前回の実装ではうまくいきましたが、戻ってみることはできましたが、searchResultsControllerを使用すると、方法が必要なときに問題が発生します。 –