2016-03-09 246 views
1

我已经设置了tableView带有搜索栏和股票名称列表。我在我的Detail View Controller中插入了一些代码,以使单元格推送到它并在标签中说出一些内容。问题是每当我点击一个单元格时,它会显示另一个单元格。有没有更好或更有效的方法推送到detail View推送到详细视图

下面是代码:

import UIKit 

class TableViewLemon: UITableViewController, UISearchResultsUpdating { 

let tableData = ["Apple","Google","Facebook","Amazon","Exxon Mobil"] 
var filteredTableData = [String]() 
var resultSearchController = UISearchController() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.resultSearchController = ({ 
     let controller = UISearchController(searchResultsController: nil) 
     controller.searchResultsUpdater = self 
     controller.dimsBackgroundDuringPresentation = false 
     controller.searchBar.sizeToFit() 

     self.tableView.tableHeaderView = controller.searchBar 

     return controller 
    })() 

    // Reload the table 
    self.tableView.reloadData() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // 1 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // 2 
    if (self.resultSearchController.active) { 
     return self.filteredTableData.count 
    } 
    else { 
     return self.tableData.count 
    } 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    // 3 
    if (self.resultSearchController.active) { 
     cell.textLabel?.text = filteredTableData[indexPath.row] 

     return cell 
    } 
    else { 
     cell.textLabel?.text = tableData[indexPath.row] 

     return cell 
    } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "DetailView") { 

     let VC = segue.destinationViewController as! DetailViewLemon 

     if let indexPath = self.tableView.indexPathForSelectedRow{ 

      let Make = tableData[indexPath.row] as String 

      VC.sentData1 = Make 
     } 
    } 
} 

func updateSearchResultsForSearchController(searchController: UISearchController) 
{ 
    filteredTableData.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) 
    let array = (tableData as NSArray).filteredArrayUsingPredicate(searchPredicate) 
    filteredTableData = array as! [String] 

    self.tableView.reloadData() 
} 
} 
+0

大部分代码是检查'self.resultSearchController.active'来决定使用哪个数组,但'prepareForSegue'不是。所以这看起来不正确。 – Michael

+0

你知道我应该为prepareForSegue添加什么吗? @Michael –

回答

0

我希望你prepareForSegue,以同样的方式cellForRowAtIndexPath确实filteredTableDatatableData区分。沿着线的东西:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "DetailView") { 
     let VC = segue.destinationViewController as! DetailViewLemon 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let Make = self.resultSearchController.active ? 
       filteredTableData[indexPath.row] as String : 
       tableData[indexPath.row] as String 
      VC.sentData1 = Make 
     } 
    } 
} 

顺便说一句,我会避免使用segue.identifier,因为它是容易出错(例如,如果你弄错了没有编译错误。)。相反,您可以在目标VC上使用if-let。

不是:

if (segue.identifier == "DetailView") { 
     let VC = segue.destinationViewController as! DetailViewLemon 
     ... 
    } 

用途:

if let VC = segue.destinationViewController as? DetailViewLemon { 
     ... 
    } 
+0

非常感谢。它终于有效,我欠你一个。 @迈克尔 –

相关问题