2011-08-28 128 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

@拉迪斯拉夫非常感谢。它的工作,我今天学到了新东西! –

相关问题