通过Subview ios的IBAction更改超级视图的子视图

时间:2011-07-17 22:09:12

标签: objective-c ios ipad uiviewcontroller

我试图在这里找到一个解决方案但是无法解决,基本上我有一个交互式子视图,我需要从子视图中切换到新的交互式子视图。我可以在主视图中使用IBAction轻松更改子视图,但是我从子视图中更改视图失败了。这是代码......这应该使我想要做的更清楚。

在MainViewController的.h中

@interface MainViewController : UIViewController {
    IBOutlet OneViewController *oneviewController;
    IBOutlet TwoViewController *twoViewController;
}

-(IBAction)goToView;

@property (nonatomic, retain) IBOutlet OneViewController *oneviewController;
@property (nonatomic, retain) IBOutlet TwoViewController *twoViewController;

@end

in .m

@implementation MainViewController

@synthesize oneviewController;
@synthesize twoViewController;

-(IBAction)goToView {   
    [self.view addSubview:twoViewController.view];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view addSubview:oneviewController.view];  
}

好的,这一切都很棒,我可以加载带有xib的ViewControllers和所有他们的`按钮工作等。 但是当我尝试......

<。>在OneViewController的.m中

#import "MainViewController"

...
[MainViewController.view addSubview:twoViewController.view];  ...

这不起作用,我尝试了各种各样的东西,通过将oneViewController添加到oneViewController的.h,但它崩溃了...我仍然很新的所有这一切所以很可能我错过了明显的。谢谢你的帮助!

我也在OneViewController的.m中试过这个。

但它仍然崩溃......虽然构建成功了

MainViewController* mySuperView = (MainViewController*)self.view.superview; TwoViewController *twoViewController; [mySuperView.view addSubview:twoViewController.view];

2 个答案:

答案 0 :(得分:0)

此操作正在错误的地方完成。如果您尝试将子视图添加到MainViewController,您应该在MainViewController.m中处理它。你在打电话:

[MainViewController.view addSubview:twoViewController.view];

但是MainViewController.view是一个静态的视图实例。如果你想保持原样,并假设OneViewController已经是MainViewController上的子视图,你应该这样做:

UIView * main = [OneViewController.view superview]; [main addSubview:twoViewController.view];

这非常危险,因为您无法保证为此视图提供超视图。我只是在MainViewController中处理所有这些。没有控制器应该有权将子视图添加到另一个控制器,除非它有一个MainViewController实例。

答案 1 :(得分:0)

以下代码有效,但它给了我一个警告......

在我的子视图中,OneViewController.m(在IBAction下)......

{for (UIView* next = [self.view superview]; next; next = next.superview) {
        UIResponder* nextResponder = [next nextResponder];

        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            [(UIViewController*)nextResponder resetSubView];
        }`

在我的MainViewController.m

- (void) resetSubView { [self.view addSubview:twoViewController.view]; }