将UIPicker选择传递给基于firstViewController Tab的应用程序

时间:2013-12-06 19:11:27

标签: ios objective-c uipickerview

所以我有一个问题,我自己想出一个挑战,我有一个有2个选项卡的应用程序:

第一个选项卡(firstViewController),它具有TAP机制,只有在第二个选项卡(secondViewController)中选择时,才能在firstViewController中执行某个方法。

在SecondViewController中,我有一个UIPickerView,有3个数据选择。在这段代码中我排除了持有数据的NSArray,但是包含了一个方法,用于在同一个“secondViewController”上显示该数据,以向UILable对象显示正在被选择的对象。

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{


 NSString *displayPickerInString = [[NSString alloc] initWithFormat:@"%@",coffeeSize[row]];
  self.displayPickerData.text = displayPickerInString;

FirstViewController *firstvs = [[FirstViewController alloc] init];

NSInteger selectedRow = [self.pickerView selectedRowInComponent: 0];

if (selectedRow == 0) {
    NSLog(@"Invalid Row"); // This block will not do nothing
}
else if (selectedRow == 1) {

    // Call a method in firstViewController
    firstvs.smallSelection;

}
else if (selectedRow == 2) {
    // Call a methos in firstViewController
    firstvs.mediumSelection;
}
else if (selectedRow == 3){
    // Call a method in firstViewController
    firstvs.largeSelection;
}

}

所以这个方法可以工作并在同一个secondViewController中本地显示,问题是我想在firstViewController上根据选择点击执行该选择。

假设我选择了第1行,在此代码中执行方法:

    firstvs.smallSelection;

在firstViewController中我有如下方法:

   -(void) smallSelection {
    NSLog(@"Small selection has been chosen");
    }

在调试窗口中,我看到它可以工作,但只有在我在tab方法上调用此方法时才在firstViewController中执行:

   -(void) selection {
     [self smallSelection];
     }

这确实执行了这个方法,但有条件地进行了测试,这里是完整的代码和phepseo代码,我试图用普通的英语解释:

    - (void) tapScreen:(UIGestureRecognizer *)gr
     {

      [self refresh:self]; // call the refresh method as the screen is tapped

      NSLog(@"Screen has been tapped");

      timer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(selection) userInfo: nil repeats: YES];

  }

 -(void) selection { 


// I want to call these according to selection made on secondViewController

// so in Phseudo code, i want it like so:

if selectionFromPicker was row1

{
[self smallSelection];

}
else if selectionFromPicker was row2
{
    [self mediumSelection];
}
else if selectionFromPicker was row3
{
    [self largeSelection];
   }
 }

为了包装,用户从UIPicker中选择secondViewController中的选项选项,并将该选择传递给firstViewController,用户点击屏幕执行所做的选择,然后点击用条件识别选择 声明并做了它的用途,比如用户回到选择器 并选择一个不同的行并点击屏幕,该选择在firstViewController上执行。有帮助吗?如果我不清楚,请随时提出更多问题。

1 个答案:

答案 0 :(得分:0)

NSNotificationCenter非常易于使用。在你的第一个VC中,你可以输入:

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(notificationReceived:)
                                      name:@"notificationName" object:nil];

这基本上会将VC添加为观察者,这意味着它将不断监视通知。收到通知后,它会执行您放入selector:

的选择器

现在在第二个VC中,您要发布要添加的通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName"
                                      object:self];

我要注意的另一件事是添加观察者。如果将NSNotificationCenter defaultCenter addObserver:selector:name:object:放在重复的方法中,那么每次调用它时都会添加另一个观察者。例如,如果将其放在viewDidLoad方法中,则每次加载视图时都会添加一个观察者,这将导致选择器被多次调用。为了解决这个问题,你需要调用removeObserver,这样它就不会为同一个通知不断创建新的观察者。

有关NSNotificationCenter的更多信息:Apple DocsTutorial