0

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

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

故事板示例

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

我的问题是我需要主表视图控制器具有来自日期选择器的事件侦听器(UIControlEventValueChanged用于更新标签)。父控制器看不到日期选择器。两个视图控制器都实现了自定义类。日期选择器控制器类将日期选择器作为 IBOutlet 对象,并且 3 个日期范围按钮选择了更改日期的方法。

看来我的问题是两个视图控制器之间的上下文。

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

更新 1:

我找到了一种解决方法,它在父级的准备序列中,将“自我”引用传递给具有父视图控制器类型属性的子级。这为孩子提供了对其父母的正确引用,然后我可以执行以下操作:

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

这有效,但感觉“混乱”。有任何想法吗?

4

3 回答 3

0

从 ViewController容器到包含的 VC的 Embed segue 也有同样的问题。

我开始怀疑 Apple 有一个错误,或者在这种情况下,segue 上可能有另一个属性(比如可能是 embeddedVC 而不是destinationVC)。但...

我终于发现,不知何故,特定的视图控制器(在故事板中)被更改为股票 UIViewController 并且不知何故把事情搞砸了。不知道这是怎么发生的,但是一旦我解决了这个问题,事情又开始起作用了。

希望这可以帮助...

于 2013-07-08T11:59:58.953 回答
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);

}
于 2017-03-08T08:19:18.617 回答
0

使用委托模式。在 prepareForSegue 中为嵌入标识符设置 controller.delegate = self。然后在子控制器的ibaction方法中调用[self.delegate catgegoryChanged]

于 2019-02-09T16:33:04.290 回答