2016-03-24 16 views
0

私は2つのコントローラ間でデータを渡そうとしています。正確には、datViewfine変数を印刷しようとすると、UIViewControllerから変数datadefineを持つUITableViewControllerにボタンがあります。いつも私は以下、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するためのコードでも、これは2番目に切り替えてきた最初のメインビューだったのコードです今すぐ表示ボタンをクリックしてポップアップ表示

// 
// 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ビューにCODEを追加しました。また、prepareforsegue関数で "test"を印刷しようとしましたが、次のビューにsegueを出力しません。 –

+2

実際の問題のように見えるのは、 'prepareForSegue' isn呼び出されません。 –

答えて

-3

viewDidLoadで印刷することはできません。 viewDidLoadは一度だけ実行され、prepareForSequeが呼び出される前に実行されます。 viewWillAppearに移動します。

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

エントリポイントビューのprepareForSqueが機能していません –

+0

私の知る限り'prepareForSegue'が呼び出された後に' viewDidLoad'が呼び出されます。 –

+0

これは当てはまりません。ビューコントローラオブジェクトは、prepareFroSegueで提供される前にインスタンス化されなければならない(MUST)。後で呼ばれることはできません。 – 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

関連する問題