2011-08-28 155 views
0

我在這裏有一些奇怪的問題,因爲我無法將NSString從一個類傳遞到另一個類。我部署了與其他類相同的方法。將NSString從一個類傳遞到另一個類

我想從secondViewController傳遞一個字符串到我的firstViewController。這就是我所做的。

firstViewController.h

NSString *pickUpAddressString; 
@property (nonatomic, retain) NSString *pickUpAddressString; 

firstViewController.m

@synthesize pickUpAddressString; 
-(void) viewWillAppear:(BOOL)animated { 
NSLog(@"pickUpAddressString is %@", pickUpAddressString); // why it's null here? 
    PickUpAddress.text = pickUpAddressString; // PickUpAddress is a UITextField 
} 

secondViewController.m

FirstViewController *controller = [[FirstViewController alloc]init]; 
    controller.pickUpAddressString = selectedAddress; // here, I set the string 
    NSLog(@"selected address :%@\npickUpAddressString:%@", selectedAddress, controller.pickUpAddressString); // I had verified that both strings are valid. 
    [self.navigationController popViewControllerAnimated:YES]; // pop to firstView 
+1

如果你大跌眼鏡回的firstView控制器,這意味着它已經開始。爲什麼用FirstViewController * controller = [[FirstViewController alloc] init]重新啓動它;如果它已經在navigationController棧上準備好了? – Ladislav

回答

3

您正在創建的FirstViewController實例...

FirstViewController *controller = [[FirstViewController alloc]init]; 

...與原始實例不同(我假設)推送了SecondViewController,並且您要通過popViewControllerAnimated:返回。


基本上,你需要的是回傳數據,推高了SecondViewController,在這種情況下,FirstViewController控制器。

或許,實現這一目標的最簡單的方法是什麼@Ladislav在他的評論中建議:

NSArray *viewControllers = [self.navigationController viewControllers]; 
FirstViewController *firstVC = [viewControllers objectAtIndex:[viewControllers count] - 2]; 

但是,請記住,這引入了SecondViewControllerFirstViewController之間的直接依賴。或換句話說,SecondViewController現在與FirstViewController緊密耦合。

簡而言之,當將數據傳遞迴層次結構時,最好使用鬆耦合以避免視圖控制器之間的直接依賴關係(緊密耦合)。這樣做的好處包括代碼可重用性和可測試性。爲了實現鬆耦合,您需要爲觀察者定義通用接口(例如,委派,通知等)。

還值得一提的是在模型對象中放置狀態信息的重要性。避免將數據放入控制器中,除非它是嚴格的演示數據。

更多關於這個話題:What's the best way to communicate between view controllers?

+0

哦,我不知道。那麼我應該如何調用我的FirstViewController的實例?我嘗試了'FirstViewController.pickUpAddressString = @「123」'但是不起作用 –

+1

使用NSArray * viewControllers = [self.navigationController viewControllers]獲取navigationController中所有視圖控制器的數組,然後使用FirstViewController獲取第二個到最後一個* firstVC =(FirstViewController *)[viewControllers objectAtIndex:viewControllers.count - 2];所有這些代碼必須在調用popViewControllerAnimated之前! – Ladislav

+0

@拉迪斯拉夫非常感謝。它的工作,我今天學到了新東西! –

相關問題