如何使我的搜索Bar TableView执行segue

时间:2014-12-27 17:58:15

标签: ios iphone uitableview swift

我在“使用Swift开始iPhone开发”一书之后创建了一个TableView应用程序。搜索Bar tableView是使用代码而不是在故事板中创建的。本书解释了如何获取搜索结果并显示相应的单元格,但我会就像我的应用程序执行一个segue到我在storyBoard中创建的ViewController。如何用代码触发Segue?

了解更多信息,这是我的文件:

import UIKit


class SearchResultsController: UITableViewController , UISearchResultsUpdating{

let sectionsTableIdentifier = "section identifier"
var products = [product]()
var filteredProducts = [product]()



override func viewDidLoad() {
    super.viewDidLoad()
    tableView.registerClass(UITableViewCell.self,
        forCellReuseIdentifier: sectionsTableIdentifier)
}


// MARK: - Table view data source
override func tableView(tableView: UITableView,
    numberOfRowsInSection section: Int) -> Int {
    return filteredProducts.count
}
override func tableView(tableView: UITableView,
    cellForRowAtIndexPath indexPath: NSIndexPath)
    -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(
    sectionsTableIdentifier) as UITableViewCell
    cell.textLabel!.text = filteredProducts[indexPath.row].name
    return cell }




// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailView"{
        let index = self.tableView?.indexPathForSelectedRow()
        var destinationViewController : infoViewController = segue.destinationViewController as infoViewController

        destinationViewController.Title  = filteredProducts[index!.row].title
        destinationViewController.eam  = filteredProducts[index!.row].energy
        destinationViewController.fam  = filteredProducts[index!.row].fat
        destinationViewController.pam  = filteredProducts[index!.row].protein
        destinationViewController.cam  = filteredProducts[index!.row].carbohydrates
        destinationViewController.imgName  = filteredProducts[index!.row].imgName

    }

}

func updateSearchResultsForSearchController(
    searchController: UISearchController) {
let searchString = searchController.searchBar.text
filteredProducts.removeAll()
        for prod in products{
            var name = prod.name.lowercaseString
            if name.rangeOfString(searchString) != nil {
                filteredProducts.append(prod)
            }
        }
 tableView.reloadData()
}}    

1 个答案:

答案 0 :(得分:0)

因为控制器是用代码构建的,所以你需要使用SearchResultsController的tableView委托方法didSelectRowAtIndexPath来触发下一个视图控制器的显示。

假设有一个基于SearchResultsController的表视图控制器,您可以将其用作SearchResultsController的委托。主表视图控制器可能已经具有在选择单元格时进行segue的必要代码,在这种情况下,您需要检查选择了哪个tableView才能正确确定单元格所代表的产品。

要设置委托,请将以下行添加到您创建SearchResultsController的代码中(在上面的评论中):

resultsController.tableView?.delegate = self

然后修改didSelectRowAtIndexPath方法以测试哪个tableView正在触发该方法:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if (tableView == self.tableView) {
        // use the existing code to present the detail VC, based on the data in the main table view
        ...
    } else {
        // use new code to present the detail VC, based on data from the SearchResultsController
        ...
    }
}

如果主表视图控制器位于故事板中,则可以使用segue显示详细信息VC。在这种情况下,您将在上面的代码中使用self.performSegueWithIdentifier()。如果没有,您可以使用self.navigationController?.pushViewController()(如果您嵌入在导航控制器中)或self.presentViewController()(以模态方式显示VC)。

另一种选择是将SearchResultsController的{​​{1}}设置为delegate(在self中),然后在viewDidLoad中实现didSelectRowAtIndexPath {1}}课程。在这种情况下,您不需要测试哪个tableView已触发该方法,但您将无法使用segue。