2014-12-06 60 views
0

我是新来Swift和Xcode一般。我正在尝试制作一个类似于Twitter的应用程序。我的问题是,在我的表格视图控制器为我的时间表后,我有两个页面/视图控制器:一个选择器选择一个特定的房子,另一个做文本。解析与迅速 - 未解决的标识符

在第二个视图控制器的代码与文本,我尝试保存一个对象与帖子的内容和选定的房子解析。内容保存得很好。但我得到的错误,当我尝试做同样的房子(因为它是从其他网页的)

我敢肯定这是我缺少一个非常简单的,明显的事情....

谢谢!

编辑:我做的匿名用户顺便说一句,如果这是有关从第一视图控制器捡拾

代码

@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) 
} 

错误是无法解析的标识符(因为它们是在另一个视图控制器中定义的?)

+0

你刚才不是问这个?正如我在评论中所写的,pickerData不属于第二视图控制器,因此您必须获取第一个视图控制器的实例才能访问该变量。 – 2014-12-06 22:42:30

+0

耶谢谢!我只是不确定获取实例的含义。你可以给我一个例子吗? – Elizabeth 2014-12-06 23:01:09

+0

是导航堆栈中第二个之前的第一个视图控制器吗? – 2014-12-06 23:41:57

回答

0

pickerDatarow都不属于第二视图控制器(即,它们是未解析的标识符),因此您必须获得第一个视图控制器的实例才能访问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] 

但总体说来,它可能是更清洁向前发送您的视图控制器对象,而不是从拉的导航堆栈。然后,在你的第二个观点

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; 
    //} 
} 

如果您使用的是故事板,例如,你可以在你的第一个视图控制器更新prepareToSegue方法与你的第二个视图控制器分享自己当前的FirstViewController实例控制器,添加一个对应的类变量来保存第一视图控制器对象:

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];