2016-03-24 5 views
0

Я пытаюсь передать данные между двумя контроллерами, а точнее, есть кнопка, которая выводит из UIViewController на UITableViewController, который имеет переменную datadefine, когда я пытаюсь напечатать переменную 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

Whereabouts вы печать данных в 'SearchViewController'? можете ли вы показать больше кода? – Wez

+0

Я добавил КОД в представление segue, также заметьте, что я также попытался напечатать «тест» в функции prepareforsegue, которая не печатает ничего, кроме segue, на следующее представление. –

+2

Похоже, ваша настоящая проблема заключается в том, что 'prepareForSegue' isn - спросил он. –

ответ

-3

Вы не можете распечатать его в viewDidLoad. viewDidLoad запускается только один раз, и это происходит до того, как fireForSque запускается. Переместите его в viewWillAppear.

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

. readyForSeque для просмотра точки входа не работает –

+0

Насколько я знаю , 'viewDidLoad' вызывается ПОСЛЕ вызова' prepareForSegue'. –

+0

Это не может быть правдой. Объект контроллера просмотра ДОЛЖЕН быть создан, прежде чем он будет предоставлен в файле prepareFroSegue. Существует NO WAY можно называть после. – 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" 

поскольку defineData из dataViewController объект не существует

но когда вы используете внутреннюю функцию didSet, вы говорите, что значение будет немедленно установлено, что объект dataViewController будет фактическим объектом.

, если вы хотите узнать больше, проверить эту ссылку: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254

Смежные вопросы