在一个视图控制器中为另一个视图控制器设置变量,并交换到该视图控制器

时间:2013-07-26 15:33:36

标签: ios

好的,我在这里有一个有趣的情况:

我有一个日历视图,此视图没有导航栏,因此我创建了另一个视图以包含日历并为该视图添加了导航栏。

所以现在我有2个视图显示导航栏和日历。

导航栏有一个应该显示“插入”控制器的按钮,但在此之前,它必须将日历中的@property设置为“插入”视图控制器。

总结一下:

外部视图控制器IBAction - > “插入”上的内部日历设置属性 - >内部日历呈现“插入”。

以下是代码:

ViewControllerCalendarContainer.h

#import <UIKit/UIKit.h>

@interface ViewControllerCalendarContainer : UIViewController

- (IBAction)SeguqInsert:(id)sender;

@end

ViewControllerCalendarContainer.m

#import "ViewControllerCalendarContainer.h"
#import "CalendarMonthViewController.h"

...

- (IBAction)SeguqInsert:(id)sender {

     CalendarMonthViewController *controller = [[CalendarMonthViewController alloc] initWithNibName:nil bundle:nil];
     [controller SegueInsert];

}

CalendarMonthViewController.h

@property (nonatomic, strong) NSDate *dateSelected; // data to send to Insert View Controller

- (void)SegueInsert; // the present "Insert View Controller Method"

CalendarMonthViewController.m

#import "CalendarMonthViewController.h"
#import "ViewControllerInsert.h"

- (void)SegueInsert {

    NSDate *dateUserSelected = self.dateSelected;

    ViewControllerInsert *controller = [[ViewControllerInsert alloc] initWithNibName:@"ViewControllerInsert" bundle:nil];

    controller.dateSelected = dateUserSelected; // set property in Insert

    [self presentViewController:controller animated:YES completion:nil]; // present

}

点击运行时错误:

其视图不在窗口层次结构中!

PS:我不能通过Storyboard进行Segue,因为它使用了另一个实例,并且应该设置的属性没有设置。

2 个答案:

答案 0 :(得分:0)

您似乎添加了一个您不需要的视图控制器。该错误是因为您从未显示该视图控制器,然后尝试从中显示另一个视图控制器。

获取SegueInsert中的代码并将其移至SeguqInsert。然后删除CalendarMonthViewController(可能没有做任何其他事情而且没有其他代码)。

答案 1 :(得分:0)

Wain是对的。额外的视图控制器导致问题。但是,我认为您不能仅仅移动代码。您应该在导航控制器中保留指向日历的指针,并在SequqInsert中设置属性。像这样:

#import <UIKit/UIKit.h>

@interface ViewControllerCalendarContainer : UIViewController

@property (weak, nonatomic) CalendarMonthViewController *calendarViewController;

- (IBAction)SeguqInsert:(id)sender;

@end


#import "ViewControllerCalendarContainer.h"
#import "CalendarMonthViewController.h"

...

- (IBAction)SeguqInsert:(id)sender {

    NSDate *dateUserSelected = self.dateSelected;
    ViewControllerInsert *controller = [[ViewControllerInsert alloc] initWithNibName:@"ViewControllerInsert" bundle:nil];
    controller.dateSelected = calendarViewController.dateUserSelected; // set property in Insert
    [self presentViewController:controller animated:YES completion:nil]; // present

}

如果您担心保留指向日历的指针,您可以随时使用协议来获取信息。