所以我有一个问题,我自己想出一个挑战,我有一个有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上执行。有帮助吗?如果我不清楚,请随时提出更多问题。
答案 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 Docs和Tutorial。