swift ios在控制器之间传递数据
我正在尝试在两个控制器之间传递数据,更准确地说,有一个按钮可以将UIViewController与具有变量datadefine的UITableViewController分隔开来,当我尝试打印datadefine变量时,尽管我在prepareForSegue函数中对其进行了设置,但它始终为空,下面是相同的代码swift ios在控制器之间传递数据,ios,swift,segue,Ios,Swift,Segue,我正在尝试在两个控制器之间传递数据,更准确地说,有一个按钮可以将UIViewController与具有变量datadefine的UITableViewController分隔开来,当我尝试打印datadefine变量时,尽管我在prepareForSegue函数中对其进行了设置,但它始终为空,下面是相同的代码 // // VC1.swift // TableViewSearchInSwift // // Created by melwyn.p on 24/03/16. // Copyri
//
// 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
}
}
无法在viewDidLoad中打印它。viewDidLoad只执行一次,它发生在prepareForSeque激发之前。将其移动到视图将显示
override func viewWillAppear(animated: Bool) {
print(defineData)
}
您应该使用在存储新值后立即调用的didSet内部函数 在SearchViewController类上尝试以下操作:
var defineData: String! {
didSet(defineData) {
self.defineData = defineData
}
}
执行此操作时:
let dataViewController = segue.destinationViewController as! SearchViewController
dataViewController.defineData = "data1"
dataViewController
变量不是实际对象
这就是为什么你不能比较这个
dataViewController.defineData = "data1"
因为dataViewController
对象的defineData
不存在
但是当您使用didSet内部函数时,您的意思是在dataViewController
对象成为实际对象后,该值将立即设置
如果您想了解更多信息,请查看此链接:您在哪里打印
SearchViewController
中的数据?你能显示更多的代码吗?我已经在segue视图中添加了代码,还请注意,我还尝试在prepareforsegue函数中打印“test”,该函数只在下一个视图中打印segue的内容。看起来你真正的问题是没有调用prepareforsegue
。是的,我不明白为什么,但是segue成功地发生在哪个类中你覆盖了prepareForSegue:而且它是你创建故事板segue的同一个类吗?据我所知,在调用prepareForSegue
之后调用了viewDidLoad
。这不可能是真的。必须先实例化视图控制器对象,然后才能在prepareFroSegue中提供它。没有办法是可以被称为后。