2014-12-06 71 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];