我在“使用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()
}}
答案 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。