Ios 使用Swift解析-未解析标识符
一般来说,我对Swift和Xcode都是新手。我正在尝试制作一款本质上与Twitter相似的应用程序。我的问题是,在我的时间表的表视图控制器之后,我有两个页面/视图控制器:一个带有选择器,用于选择特定的房子,另一个用于制作文本帖子 在第二个视图控制器的代码和文本中,我尝试保存一个包含帖子内容和要解析的选定房屋的对象。内容保存得很好。但是当我试图对房子做同样的事情时,我会出错(因为它来自不同的页面) 我敢肯定,这是一个非常简单,很明显的事情,我错过了 谢谢 编辑:我正在做匿名用户btw,如果相关的话 第一视图控制器中选择器的代码Ios 使用Swift解析-未解析标识符,ios,swift,Ios,Swift,一般来说,我对Swift和Xcode都是新手。我正在尝试制作一款本质上与Twitter相似的应用程序。我的问题是,在我的时间表的表视图控制器之后,我有两个页面/视图控制器:一个带有选择器,用于选择特定的房子,另一个用于制作文本帖子 在第二个视图控制器的代码和文本中,我尝试保存一个包含帖子内容和要解析的选定房屋的对象。内容保存得很好。但是当我试图对房子做同样的事情时,我会出错(因为它来自不同的页面) 我敢肯定,这是一个非常简单,很明显的事情,我错过了 谢谢 编辑:我正在做匿名用户btw,如果相关的
@IBOutlet weak var label: UILabel!
@IBOutlet weak var picker: UIPickerView!
let pickerData = ["Adams","Cabot","Currier","Dunster","Eliot","Kirkland","Leverett","Lowell","Mather","Pforzheimer","Quincy","Winthrop"]
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView,
numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(pickerView: UIPickerView,
titleForRow row: Int,
forComponent component: Int) -> String!{
return pickerData[row]
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
self.label.text = pickerData[row]
}
override func viewDidLoad() {
super.viewDidLoad()
// label is "Adams" when first loaded
label.text = pickerData[0]
picker = UIPickerView()
}
从第二个视图控件编写代码以将其保存到解析
@IBAction func PostText(sender: AnyObject) {
// establish object to save in Parse CHANGE USER TO HOUSE
var post:PFObject = PFObject(className: "Posts")
post["content"] = PostTextView.text
post["user"] = PFUser.currentUser()
post["house"] = pickerData[row].text
post.saveInBackgroundWithTarget(nil , selector: nil)
// return to navigation screen
self.navigationController?.popToRootViewControllerAnimated(true)
}
错误是未解析的标识符(因为它们是在另一个视图控制器中定义的?无论是
pickerData
还是row
都不属于第二个视图控制器(即,它们是未解析的标识符)因此,您必须获得First View Controller的实例,才能访问pickerData
变量并查找picker
当前选定的“行”
只要使用UINavigationController
,就可以在堆栈中找到以前的任何视图控制器。如果FirstViewController
紧跟在当前SecondViewController
之前,您可以在导航堆栈上找到它的一个索引,例如:
let navigationController: UINavigationController = self.navigationController!
let numberOfViewControllers = navigationController.viewControllers.count
var firstViewController: FirstViewController = navigationController.viewControllers[numberOfViewControllers - 2] as FirstViewController
let row = firstViewController.picker.selectedRowInComponent(0)
post["house"] = firstViewController.pickerData[row]
但一般来说,向前发送视图控制器对象而不是将其从导航堆栈中拉出可能更干净
例如,如果您使用的是故事板,则可以更新第一视图控制器中的prepareToSegue
方法,以便与第二视图控制器共享当前的FirstViewController
实例:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// (Uncomment the if block and specify a segue if this isn't the
// segue leading from your view controller.)
//if segue.identifier == "yourSegueName" {
let secondViewController = segue.destinationViewController as SecondViewController
secondViewController.firstViewController = self;
//}
}
然后在第二个视图控制器中,添加相应的类变量以保存第一个视图控制器对象:
class SecondViewController: UIViewController {
var firstViewController: FirstViewController!
这样,您就可以在FirstViewController
中访问其值,如下所示:
let row = firstViewController.picker.selectedRowInComponent(0)
post["house"] = firstViewController.pickerData[row]
如果您使用的是不带故事板的UINavigationController
,则可以在创建SecondViewController
时类似地设置SecondViewController
的FirstViewController
变量,例如:
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.firstViewController = self;
[self.navigationController pushViewController:secondViewController animated:YES];
你刚才不是问这个吗?正如我在评论中所写,pickerData不属于第二视图控制器,因此您必须获得第一视图控制器的实例才能访问该变量。是的,谢谢!我只是不知道得到一个实例意味着什么。你能给我举个例子吗?第一个视图控制器在导航堆栈的第二个之前吗?没关系。我写了一个答案,无论第一视图控制器是否在前面,这个答案都应该有效。