在上面提供的图片中,显示了三个视图控制器。
按照他们显示的顺序调用视图控制器 A , B 和 C 。
查看控制器A 通过单击表格单元格传递已解析的jSON数据。这填补了"总销售额,折扣等。"使用 prepareForSegue 方法在查看控制器B 内的字符串/标签。
此数据基于开始时间/结束时间,执行segue时的默认参数提供当天上午8点至晚上10点的信息。
解析字符串看起来像这样
NSDate *currentDate = [NSDate date];
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"YYYY-MM-dd"];
NSString *theDate = [dateformatter stringFromDate: currentDate];
NSString *salesStr = @"http://";
salesStr = [salesStr stringByAppendingString:host];
salesStr = [salesStr stringByAppendingString:@":8080/sales.php?password="];
salesStr = [salesStr stringByAppendingString:pass];
salesStr = [salesStr stringByAppendingString:@"&db="];
salesStr = [salesStr stringByAppendingString:db];
salesStr = [salesStr stringByAppendingString:@"&sdate="];
salesStr = [salesStr stringByAppendingString:theDate];
salesStr = [salesStr stringByAppendingString:@"%2008:00:00&edate="];
salesStr = [salesStr stringByAppendingString:theDate];
salesStr = [salesStr stringByAppendingString:@"%2022:00:00"];
在查看控制器B 内部,您会看到标有" 开始时间"的按钮。此按钮启动推送segue 至查看控制器C 。在这个新的视图控制器中,您可以选择日期和时间,它显示在日期选择器上方的UILabel中。日期选择器下方的按钮是IBAction并使用
[self.navigationController popViewControllerAnimated:YES];
我的问题是: 如何在查看控制器C 中选择日期/时间,按一个按钮,然后发送位于UILabel的信息查看控制器B ,以便它可用于更新已解析的信息?
我能想到的一种方法是让按钮转到查看控制器B ,并根据日期/时间选择重新分配信息,但这只会导致太多'导航控制器堆叠'并且对我来说似乎并不高效。
任何建议都表示赞赏。
答案 0 :(得分:2)
黑客的方法可行。
Apple的文档显示了一种略有不同的技术。使用视图控制器C可用于与视图控制器B通信的方法定义简单协议。然后给视图控制器C一个符合该协议的委托属性。
在prepareForSegue方法中,将自己设置为视图控制器C的委托。
然后,在视图控制器C中,当用户更改日期并单击按钮时,调用委托方法通知视图控制器B用户在弹出自己之前更改了日期值。
我建议添加一个取消按钮,这样用户就可以放弃他们的更改。在这种情况下,您只需在弹出之前跳过调用委托方法。
答案 1 :(得分:1)
在视图控制器C的界面中添加属性
@property (nonatomic, strong) NSDate *selectedDate;
从B执行C之前
[cViewController addObserver:self forKeyPath:@"selectedDate" options:0 context:NULL];
并实施
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//do some stuff
}
在视图控制器B中。
选择新日期时(在视图控制器V中)
self.date = myPicker.date;
因此,当设置新日期时,视图控制器B会收到通知
不要忘记删除B实现中的观察者(例如viewWillAppear)......
[cViewController removeObserver: self....];