使用Embed Segue将数据传递到Container View

时间:2013-04-06 22:23:49

标签: ios6 storyboard uitableview uidatepicker uistoryboardsegue

因此,当segue是push(在prepareForSegue方法中)时,我已经看到大多数教程(并且正在使用该技术)将数据从一个视图控制器传递到下一个视图控制器。我可以将destinationViewController强制转换为自定义类,并将数据推送到自定义属性中。

但是,当我尝试为Embed Segue(iOS6中允许容器视图工作的新版本)执行此操作时,destinationViewController似乎不正确;它只是一个UIViewController,而不是我在故事板中定义的自定义类。

Storyboard Example

如您所见,我的主表视图包含开始日期和结束日期。然后我有一个使用Container View嵌入的子视图。这有一个命令日期工具栏+一个UIDatePicker。

我的问题是我需要主表视图控制器从日期选择器(UIControlEventValueChanged一个)获得一个事件监听器来更新标签。父控制器无法查看日期选择器。两个View Controller都实现了自定义类。日期选择器控制器类将日期选择器作为IBOutlet对象,3个日期范围按钮具有选定的方法,这些方法确实会更改日期。

这似乎我的问题是两个视图控制器之间的上下文。

仅供参考:我需要将它们分开,以便我可以切换日期选择器小工具的可见性。工具栏。

更新1:

我找到了一个解决方法,它在父级别的prepare segue上,向具有父视图控制器类型属性的子级传递“self”引用。这为孩子提供了对其父母的正确引用,然后我可以执行以下操作:

-(void) viewDidLoad {
    [[self datePicker] addTarget:[self graphSettingsViewController] action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
}

这有效,但感觉“凌乱”。有什么想法吗?

3 个答案:

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