Swift SearchResultsController Segue - “接收者......没有标识符'testSeg''的segue”

Posted

技术标签:

【中文标题】Swift SearchResultsController Segue - “接收者......没有标识符\'testSeg\'\'的segue”【英文标题】:Swift SearchResultsController Segue - "Receiver ... has no segue with identifier 'testSeg''"Swift SearchResultsController Segue - “接收者......没有标识符'testSeg''的segue” 【发布时间】:2016-10-07 18:01:59 【问题描述】:

我在从 searchResultController 转移到另一个视图控制器时遇到问题

从一开始: 我有三个控制器,一个内嵌有 CollectionView 和 UISearchController 的 UIViewController,一个充当 searchResultController 的 UITableViewController 和一个最终的 UIViewController,每个 tableview 单元格在单击时都会继续。 Here is an image of Main.Storyboard。 Here the segue with its identifier is shown, which is the problem.

segue 链接自 SearchResultsTableViewController 本身,而不是 tableviewcell 单击搜索结果后,我会从 SearchResultsController 中的 didSelectRowAtIndexPath 方法执行该 Segue。但是,我收到“Receiver ... has no segue with identifier 'testSeg''”错误。

为清楚起见,控制器的名称及其角色为:

1)DiscoverViewController:(包含 UISearchController 和 CollectionView)

2) SearchResultsTableViewController(充当正确过滤和更新任何数据的searchResultsController。每个单元格都应该与此控制器分离)

3) UIViewController(一个简单的 UIViewController,它是 segue 的目的地)

问题在于转场,其他一切都按预期执行。这是 SearchResultsTableViewController 的代码。

注意:您可以忽略这是 Swift 3 的事实。我尝试使用 Swift 2.3 并得到相同的错误

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)


searchResults 数组来自 DiscoverViewController。除了segue,一切都很好。选择一行后,应用程序崩溃并出现错误:

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''

我已确保 segue 标识符中没有空格或任何内容。我什至直接将它复制到 SearchResultsTableViewController 的 didselectrowatindexpath 函数中。

总而言之,我要求的是帮助,当我在 IB 中连接时,为什么 SearchResultsTableViewController 不能再识别 segue(或具有任何标识符的任何 segue)。任何帮助将不胜感激。

【问题讨论】:

如何实例化 SearchResultsTableViewController? 在您的 GitHub 链接中找到它。问题源于您如何实例化 SearchResultsTableViewController。这一行:let searchResultsController = SearchResultsTableViewController() 创建了它,但没有参考故事板——因此它对故事板中定义的 segue 一无所知。您应该改用 UIStoryboard 方法instantiateViewControllerWithIdentifier(如果需要,在情节提要中添加了一个标识符)。 这绝对有效。我之前实际上已经尝试过,但它继续崩溃,直到我删除了 searchREsultsController 中的重复实例化。谢谢你的回答。然而,似乎没有“回头路”。我意识到演示中没有导航控制器,但是如果说这是一个用户搜索功能,用户将如何返回搜索结果?我之前工作过的一个实现允许返回,但是当需要返回时使用 searchResultsController 会导致复杂化。 【参考方案1】:

错误很明显,您没有任何带有标识符testSeg 的segue。单击segue,然后在右侧菜单中转到属性检查器并将标识符testSeg 添加到其中。

【讨论】:

你有segue,但你必须为它设置标识符。 我已经设置了标识符。请看第二张图片。在我的问题中。这是问题开头的链接,它是我的故事板的图像。我有 segue 和标识符 然后重启xcode并清理项目并重新运行。 你能把你的项目上传到 Dropbox 或 google drive 并发送链接,我去看看。 我上传到了 Github。这是:github.com/ChrishonWyllie/MultiTestDemo。您可以忽略其中带有“2”的 swift 文件。这些只是我一直在测试的新版本【参考方案2】:

我有同样的问题。我添加了新的 segue 和新的 unwind segue,定义了一个标识符,测试我的应用程序并为两个新的 segues 得到相同的错误

接收者 <...> 没有带有标识符“...”的转义

我解决了。 就我而言,问题是我错误地在两个故事板 Main.Storyboard(Base) 和 Main.Storyboard(English) 中有两个相同类的实例。一个新的 segues 只存在于一个故事板中。 我不需要两个故事板,所以我只需删除 Main.Storyboard(English) 即可解决问题。

【讨论】:

请同时提供一些代码...提前致谢! 我删除了 Main.Storyboard(English),代码没有任何变化...谢谢!

以上是关于Swift SearchResultsController Segue - “接收者......没有标识符'testSeg''的segue”的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift