2016-02-03 77 views
3

问题:在搜索结果斯威夫特搜索结果控制器Segue公司到另一个视图控制器

我有一个表,视图,用户可以通过滚动找到的东西,或者使用搜索栏。搜索栏不是使用StoryBoard创建的。我的看法有一个UISearchController处理搜索栏和搜索结果更新。我遇到的问题是,因为我的SearchResultsController由另一个控制器实例化,所以我无法对另一个视图执行segue,或者至少我找不到解决方案。除了我的搜索结果控制器和其目的地视图之间的一切之外,一切都可以正常工作。

我想这样做

有我MyNavTableViewController委托MySearchResultsController。在搜索结果控制器中,当用户点击TableViewCell时,它将继续到另一个视图。我没有使用StoryBoard来完成这个我很难使用segues转换到另一个视图。

如果我不能得到这个工作,我可能会做:

这是至关重要的我通过视图之间的信息,对于我来说,我使用塞格斯始终做到了。但是,如果这不起作用,我可能会尝试通过将其推送到导航控制器堆栈并将数据写入共享数据库或其他东西来模式地呈现视图。我宁愿使用segue。

研究: 绝对不止这些,但我不会在网址上占用太多空间。

Creating a segue programmatically

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html

我的设置

我会尽力保持这个尽可能简明扼要。有比我显示更多的代码。我只是试着把它清理干净,这样我才能提出重要的东西。我也在改变一些名字,因为可能有敏感信息。这可能不是什么大不了的事情,但我宁愿安全。

class MyNavTableViewController: UIViewController, UITableViewDataSource{ 

    //this is 
    @IBOutlet weak var tableView: UITableView! 
    var searchController: UISearchController! 


    override func viewDidLoad(){ 
     ...code 

     tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: tblId) 

    let resultsController = MySearchResultsController() 
    resultsController.databaseFilePath = databaseFilePath() 
    //this is essential that I use a segue because between my views I'm passing information between them. 
    resultsController.photo = photo! 

    searchController = UISearchController(searchResultsController:  resultsController) 
    let searchBar = searchController.searchBar 
    searchBar.placeholder = searchBarPlaceHolderText 
    searchBar.sizeToFit() 
    tableView.tableHeaderView = searchBar 
    searchController.searchResultsUpdater = resultsController 

    } 


} 


MySearchResultsController: UITableViewController, UISearchResultsUpdating { 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    //self.performSegueWithIdentifier(imagePrepareStoryBoardId, sender: tableView.cellForRowAtIndexPath(indexPath)) 
    /*let imagePrepare = ImagePrepareController() 
    customSegue = SearchResultSegue(identifier: imagePrepareId, source: self, destination: imagePrepare)*/ 

    //neither storyboard nor navigationController can be nil. 
    let destVC = self.storyboard!.instantiateViewControllerWithIdentifier(imagePrepareStoryBoardId) 
    //destVC.photo = photo! 


    //self.presentViewController(destVC, animated: false, completion: nil) 

    self.navigationController!.pushViewController(destVC, animated: false) 


    } 
} 

我失败的尝试

1)直线上升赛格瑞 - 不工作,因为MySearchResultsController是不是在故事板视图。从我读过的所有内容来看,segues只能在SB中创建。

2)将视图推入导航堆栈。唯一的问题是,我不能在视图之间发送数据(或者至少从我读过的内容)。我也得到这个错误在这个突破点:

let destVC = self.storyboard!.instantiateViewControllerWithIdentifier(imagePrepareStoryBoardId) 

fatal error: unexpectedly found nil while unwrapping an Optional value 

我double检查imagePrepareStoryBoardId。这是正确的。

3)使用自定义segue - 正如您从注释掉的行中可以看出,这也不起作用。我一直在使用SB,因此这种方法对我来说有点新鲜。我可能会把它搞乱。

+0

为什么不使用协议作为代表? –

+0

@ViníciusAlbino我不知道这是如何帮助的(从我自己的无知)。我的意思不是粗鲁的。您可能会看到解决方案,并且可以轻松地将其总结为此,但我没有遵循。如果你能扩大这一点,我将不胜感激。 – enigmasck

回答

6

首先创建一个协议

protocol SelectedCellProtocol { 
    func didSelectedCell(text: String) 
} 
您UITableViewClass

声明它

class MySearchResultsController: UITableViewController, UISearchResultsUpdating { 
    var delegate:SelectedCellProtocol? 
} 

,并在选定单元格的方法调用它:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    self.delegate?.didSelectedCell(cell.textLabel?.text) 
} 

当你宣布你的结果控制器,设置代表

let resultsController = MySearchResultsController() 
    resultsController.databaseFilePath = databaseFilePath() 
    //this is essential that I use a segue because between my views I'm passing information between them. 
    resultsController.photo = photo! 
resultsController.delegate = self 

    searchController = UISearchController(searchResultsController:  resultsController) 
    let searchBar = searchController.searchBar 
    searchBar.placeholder = searchBarPlaceHolderText 
    searchBar.sizeToFit() 
    tableView.tableHeaderView = searchBar 
    searchController.searchResultsUpdater = resultsController 

,然后实现协议

class MyNavTableViewController: UIViewController, UITableViewDataSource, SelectedCellProtocol{ 
    func didSelectedCell(text: String) { 
     print(text) 
     //make your custom segue 
    } 
} 
+0

工作就像一个魅力!尽管这很简单,但我仍然认为它很聪明。也许我太习惯于在框架中找到解决方案。谢谢! – enigmasck

相关问题