因此,当segue是push(在prepareForSegue方法中)时,我已经看到大多数教程(并且正在使用该技术)将数据从一个视图控制器传递到下一个视图控制器。我可以将destinationViewController
强制转换为自定义类,并将数据推送到自定义属性中。
但是,当我尝试为Embed Segue(iOS6中允许容器视图工作的新版本)执行此操作时,destinationViewController似乎不正确;它只是一个UIViewController,而不是我在故事板中定义的自定义类。
如您所见,我的主表视图包含开始日期和结束日期。然后我有一个使用Container View嵌入的子视图。这有一个命令日期工具栏+一个UIDatePicker。
我的问题是我需要主表视图控制器从日期选择器(UIControlEventValueChanged
一个)获得一个事件监听器来更新标签。父控制器无法查看日期选择器。两个View Controller都实现了自定义类。日期选择器控制器类将日期选择器作为IBOutlet对象,3个日期范围按钮具有选定的方法,这些方法确实会更改日期。
这似乎我的问题是两个视图控制器之间的上下文。
仅供参考:我需要将它们分开,以便我可以切换日期选择器小工具的可见性。工具栏。
我找到了一个解决方法,它在父级别的prepare segue上,向具有父视图控制器类型属性的子级传递“self”引用。这为孩子提供了对其父母的正确引用,然后我可以执行以下操作:
-(void) viewDidLoad {
[[self datePicker] addTarget:[self graphSettingsViewController] action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
}
这有效,但感觉“凌乱”。有什么想法吗?
答案 0 :(得分:0)
我遇到了从ViewController 容器到包含VC的嵌入segue的相同问题。
我开始怀疑Apple有一个bug或者在这种情况下可能在segue上有另一个属性(比如embeddedVC而不是destinationVC)。但...
我终于发现,不知何故,特定的源视图控制器(在故事板中)被更改为库存UIViewController并且以某种方式搞砸了。不知道是怎么发生的,但是一旦我解决了这个问题,事情又开始了。
希望这会有所帮助......
答案 1 :(得分:0)
使用Embed Segue将数据传递到容器视图
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"toMenuCategory"]) {
MenuCategoryVC * childViewController = (MenuCategoryVC *) [segue destinationViewController];
childViewController.activityList = self.menuCategoryList;
childViewController.setCategoryInfo= ^ (NSDictionary *dictCategoryInfo){
NSLog(@"dictCategoryInfo = %@" , dictCategoryInfo);
};
}
}
<强> MenuCategoryVC.h 强>
#import <UIKit/UIKit.h>
@interface MenuCategoryVC : UIViewController
@property (nonatomic,strong) NSMutableArray* activityList;
@property (nonatomic, copy) void (^setCategoryInfo)(NSDictionary *dictCategoryInfo);
<强> MenuCategoryVC.m 强>
// MARK: -
// MARK: - BUTTON NEXT ACTION
- (IBAction)actionNext:(id)sender {
self.setCategoryInfo(categoriesData);
}
答案 2 :(得分:0)
使用委托模式。在prepareForSegue中,为嵌入标识符设置controller.delegate = self。然后在子控制器的ibaction方法中调用[self.delegate catgegoryChanged]