2016-03-09 143 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

非常感謝。它終於有效,我欠你一個。 @邁克爾 –

相關問題