我在这里有一些奇怪的问题,因为我无法将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
答案 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];
但请注意,这会在SecondViewController
和FirstViewController
之间引入直接依赖关系。或者,换句话说,SecondViewController
现在与FirstViewController
紧密耦合。
简而言之,在将数据传递回层次结构时,最佳做法是使用松耦合来避免视图控制器之间的直接依赖关系(紧耦合)。这样做的好处包括代码可重用性和可测试性。为了实现松散耦合,您需要为观察者定义一个通用接口(例如委托,通知等)。
还值得一提的是将状态信息放在模型对象中的重要性。避免将数据放入控制器内,除非它是严格的表示数据。
有关此主题的更多信息:What's the best way to communicate between view controllers?