如何从拥有UIPickerView的视图控制器外部访问UIPickerView值?

时间:2015-08-10 15:23:36

标签: objective-c uipickerview

我在ViewControllerA中声明了一个选择器View(在Xib文件中)。此Xib作为ViewControllerB的tableView中的自定义单元格加载。如果我更改Picker View的值,我如何在ViewControllerB中访问此更改的值。

3 个答案:

答案 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"]);
    }];