Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift解析-未解析标识符_Ios_Swift - Fatal编程技术网

Ios 使用Swift解析-未解析标识符

Ios 使用Swift解析-未解析标识符,ios,swift,Ios,Swift,一般来说,我对Swift和Xcode都是新手。我正在尝试制作一款本质上与Twitter相似的应用程序。我的问题是,在我的时间表的表视图控制器之后,我有两个页面/视图控制器:一个带有选择器,用于选择特定的房子,另一个用于制作文本帖子 在第二个视图控制器的代码和文本中,我尝试保存一个包含帖子内容和要解析的选定房屋的对象。内容保存得很好。但是当我试图对房子做同样的事情时,我会出错(因为它来自不同的页面) 我敢肯定,这是一个非常简单,很明显的事情,我错过了 谢谢 编辑:我正在做匿名用户btw,如果相关的

一般来说,我对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不属于第二视图控制器,因此您必须获得第一视图控制器的实例才能访问该变量。是的,谢谢!我只是不知道得到一个实例意味着什么。你能给我举个例子吗?第一个视图控制器在导航堆栈的第二个之前吗?没关系。我写了一个答案,无论第一视图控制器是否在前面,这个答案都应该有效。