我在ViewControllerA中声明了一个选择器View(在Xib文件中)。此Xib作为ViewControllerB的tableView中的自定义单元格加载。如果我更改Picker View的值,我如何在ViewControllerB中访问此更改的值。
答案 0 :(得分:1)
您可以使用各种方式从ViewController A上的viewController A获取picker值,例如静态getter setter,App委托类,我在这里使用appDelegate类提到 在AppDelegate.h中,类声明了您选择的数据类型的属性,因为我将其视为NSString
@property (nonatomic, strong) NSString* pickerValue;
在viewController A中的AppDelegate类和viewDidLoad中的B中获取实例
self.appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
在picker委托方法中将值设置为
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component
{ self.appDelegate.pickerValue = self.pickerData [row];
}
在viewController B中,您可以使用
中的用户值 NSLog(@"ViewControllerB::picker valuer::%@",self.appDelegate.pickerValue);
答案 1 :(得分:1)
您可以通过在UIPickerView
上公开属性来访问ViewControllerA
的值...如果有viewControllerB
需要知道值的设置情况,则在viewControllerB
的控制下{1}},然后viewControllerB
可以在viewControllerA
处查看该属性...
但是,您可能会询问有关通信的更一般性问题 - 请ViewControllerB
需要了解UIPickerView
内部ViewControllerA
的更改的具体示例{1}} ...
关于Communication Patterns的这篇文章值得一读。它涵盖 KVO ,通知,委托,阻止和目标/行动。< / p>
本文中间附近有一个流程图,可以帮助评估在特定情况下使用的通信策略。
根据您所写的内容,听起来您可以使用KVO(键值观察)或委派。
当一个UIViewContoller
想知道另一个UIViewController
所做的更改时,我倾向于在方案中使用委托,例如当viewControllerC
出现viewControllerD
时 - 并希望了解viewControllerD
中所做的更改。
在您的情况下,您可以使用委托方法:
- (void)pickerViewValueDidChange:(NSString*)newValue;
委托方法将成为@protocol
的一部分。类似的东西:
@protocol ABCPickerViewDelegate
- (void)pickerViewValueDidChange:(NSString*)newValue;
@end
如果您不熟悉,请参阅Working with Protocols ...
viewControllerB
符合该协议。 viewControllerA
将具有符合协议的属性,例如:
@property (weak, nonatomic) id <ABCPickerViewDelegate> pickerDelegate;
然后,当UIPickerView
值在viewControllerA
内更改时 - 它可以调用委托方法...然后,viewControllerB
会知道更改已经发生,值是什么
答案 2 :(得分:0)
更具适应性的方式: 使用NSNotification。
在ViewControllerA中实现UIPickerViewDelegate方法:
- (void)pickerView:(UIPickerView * _Nonnull)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
//get the data of the picker and save it in the dictionary
NSMutableDictionary *pickerData =[NSMutableDictionary new]
[pickerData setValue:[yourArrayForPicker objectAtIndex:row] forKey:@"value"];
//create and send the notification with the dictionary
[[NSNotificationCenter defaultCenter]
postNotificationName:@"XYYourNotification"
object:pickerData];
}
比在ViewControllerB中注册通知的监听器:
//put this code where you want (maybe in view did load)
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserverForName:@"XYYourNotification"
object:nil
queue:nil
usingBlock:^(NSNotification *notification)
{
//this code will be called when the notification is received
NSDictionary* info = [notification userInfo];
NSLog(@"selected :%@", [pickerData valueForKey:@"value"]);
}];