将NSString从一个类传递到另一个类

时间:2011-08-28 13:53:54

标签: iphone objective-c 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 个答案:

答案 0 :(得分: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?