使用[popviewcontroller]传回数据,然后重新加载数据

时间:2014-06-03 22:59:09

标签: ios objective-c json poptoviewcontroller

http://imgur.com/2lAJmVd

在上面提供的图片中,显示了三个视图控制器。

按照他们显示的顺序调用视图控制器 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 ,并根据日期/时间选择重新分配信息,但这只会导致太多'导航控制器堆叠'并且对我来说似乎并不高效。

任何建议都表示赞赏。

2 个答案:

答案 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....];