2016-03-24 57 views
0

我想在兩個控制器之間傳遞數據,更確切地說,有一個按鈕從一個UIViewController繼承到一個具有可變數據定義的UITableViewController,當我嘗試打印datadefine變量時總是空白雖然我在prepareForSegue功能設置它,下面是對於相同的Swift ios在控制器之間傳遞數據

// 
// VC1.swift 
// TableViewSearchInSwift 
// 
// Created by melwyn.p on 24/03/16. 
// Copyright © 2016 TheAppGururz. All rights reserved. 
// 

import UIKit 

class VC1: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

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

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let dataViewController = segue.destinationViewController as! SearchViewController 
     dataViewController.defineData = "data1" 
     print("test")  
    } 

} 
下面

代碼爲searchViewController代碼,也這是在第一次已經被切換至所述第二主視圖現在查看彈出按鈕點擊彈出

// 
// SearchViewController.swift 
// TableViewSearchInSwift 
// 
// Created by TheAppGuruz-iOS-103 on 24/12/15. 
// Copyright © 2015 TheAppGururz. All rights reserved. 
// 

import UIKit 

class SearchViewController: UIViewController, UITableViewDelegate, UISearchDisplayDelegate, UISearchBarDelegate 
{ 

    var marrCountryList = [String]() 
    var marrFilteredCountryList = [String]() 
    var defineData = String() 
    var file = String() 


    @IBOutlet var tblCountry: UITableView! 

    override func viewDidLoad() 
    { 
     print(defineData) 

     super.viewDidLoad() 
     var text="" 


     print(defineData) 




     if defineData == "data1" 
     { 
      file = "/data1.txt" 
     } 
     else 
     { 
      file = "/data2.txt" 
     } 


     do{ 
       text = try String(contentsOfFile: file, encoding: NSUTF8StringEncoding) 



        } 
     catch 
     { 
      print(error); 
      //contentsOfFile = nil; 
     } 
     marrCountryList = text.componentsSeparatedByString("\n") 
     self.tblCountry.reloadData() 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     if tableView == self.searchDisplayController!.searchResultsTableView { 
      return self.marrFilteredCountryList.count 
     } else { 
      return self.marrCountryList.count 
     } 
    } 

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

     var countryName : String! 
     if tableView == self.searchDisplayController!.searchResultsTableView { 
      countryName = marrFilteredCountryList[indexPath.row] 
     } else { 
      countryName = marrCountryList[indexPath.row] 
     } 

     cellCountry.textLabel?.text = countryName.componentsSeparatedByString("%%")[0] 

     return cellCountry 
    } 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     print(defineData) 
    } 

    func filterTableViewForEnterText(searchText: String) { 
     let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchText) 

     let array = (self.marrCountryList as NSArray).filteredArrayUsingPredicate(searchPredicate) 
     self.marrFilteredCountryList = array as! [String] 
     self.tblCountry.reloadData() 
    } 


    func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool { 
     self.filterTableViewForEnterText(searchString!) 
     return true 
    } 

    func searchDisplayController(controller: UISearchDisplayController, 
     shouldReloadTableForSearchScope searchOption: Int) -> Bool { 
      self.filterTableViewForEnterText(self.searchDisplayController!.searchBar.text!) 
      return true 
    } 
} 
+0

下落你在'SearchViewController'打印數據?你能展示更多的代碼嗎? – Wez

+0

我已經將代碼添加到segue視圖中,還要注意,我也試圖在prepareforsegue函數中打印「test」,該函數沒有打印任何東西,但是segue的視圖到下一個視圖 –

+2

看起來你真正的問題是'prepareForSegue' isn不叫。 –

回答

-3

你不能在viewDidLoad中打印它。 viewDidLoad只會被執行一次,它發生在prepareForSeque觸發之前。將它移動到viewWillAppear。

override func viewWillAppear(animated: Bool) { 
    print(defineData)  
} 
+0

prepareForSeque對於入口點視圖不起作用 –

+0

據我所知,調用'prepareForSegue'後調用'viewDidLoad'。 –

+0

這不可能是真的。視圖控制器對象必須在可以在prepareFroSegue中提供之前實例化。有沒有辦法可以被稱爲後。 – ryantxr

-3

您應該使用在新值存儲後立即調用的didSet內部函數。

試試這SearchViewController類:

var defineData: String! { 
    didSet(defineData) { 
     self.defineData = defineData 
    } 
} 

,當你這樣做:

let dataViewController = segue.destinationViewController as! SearchViewController 
dataViewController.defineData = "data1" 

dataViewController變量不是一個實際的對象 ,這就是爲什麼你不能比較這

dataViewController.defineData = "data1" 

因爲defineDatadataViewController對象不存在

但是,當您使用didSet內部函數時,您說該值將立即設置,之後dataViewController對象將成爲實際對象。

,如果你想了解更多,請點擊此鏈接:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254

相關問題