你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 貓貓學iOS 之控制器view顯示中view的父子關系及controller的父子關系_解決屏幕旋轉不能傳遞事件問題

貓貓學iOS 之控制器view顯示中view的父子關系及controller的父子關系_解決屏幕旋轉不能傳遞事件問題

編輯:IOS開發綜合

 

一:效果

這裡寫圖片描述

二:項目代碼

這個Demo用的幾個控制器分別畫了不通的xib,隨便拖拽了幾個空間,主要是幾個按鈕的切換,主要代碼展示下:

//
//  NYViewController.m
//  控制器的view的顯示
//
//  Created by apple on 14-10-10.
//  Copyright (c) 2014年 heima. All rights reserved.
//

#import NYViewController.h
#import NYTestViewController.h

#import NYOneViewController.h
#import NYTwoViewController.h
#import NYThreeViewController.h

@interface NYViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3;
@property (nonatomic, strong) NYTestViewController *test;

@property (nonatomic, strong) NYOneViewController *one;
@property (nonatomic, strong) NYTwoViewController *two;
@property (nonatomic, strong) NYThreeViewController *three;
@end

@implementation NYViewController

- (NYOneViewController *)one
{
    if (!_one) {
        self.one = [[NYOneViewController alloc] init];
        self.one.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _one;
}

- (NYTwoViewController *)two
{
    if (!_two) {
        self.two = [[NYTwoViewController alloc] init];
        self.two.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _two;
}

- (NYThreeViewController *)three
{
    if (!_three) {
        self.three = [[NYThreeViewController alloc] init];
        self.three.view.frame = CGRectMake(10, 70, 300, 300);
    }
    return _three;
}

/**
 * 即將旋轉到某個屏幕時調用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@NYViewController---willRotateToInterfaceOrientation);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@NYViewController---didRotateFromInterfaceOrientation);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

//    NYTestViewController *test = [[NYTestViewController alloc] init];
//    test.view.frame = CGRectMake(100, 100, 200, 300);
//    test.view.backgroundColor = [UIColor redColor];
//    [self.view addSubview:test.view];
//    self.test = test;

    // 如果發現:控制器的view還在,但是view上面的數據不顯示,極大可能是因為:控制器被提前銷毀了

    // 1.一個控制器的view是可以隨意調整尺寸和位置的
    // 2.一個控制器的view是可以隨意添加到其他view中
    // 3.如果將一個控制器的view,添加到其他view中顯示,那麼要想辦法保證控制器不被銷毀
    // 4.原則:只要view在,view所在的控制器必須得在,這樣才能保證view內部的數據和業務邏輯正常
}

- (IBAction)vc1 {
    [self.two.view removeFromSuperview];
    [self.three.view removeFromSuperview];
    [self.view addSubview:self.one.view];
}

- (IBAction)vc2 {
    [self.one.view removeFromSuperview];
    [self.three.view removeFromSuperview];
    [self.view addSubview:self.two.view];
}

- (IBAction)vc3 {
    [self.two.view removeFromSuperview];
    [self.one.view removeFromSuperview];
    [self.view addSubview:self.three.view];
}
@end

三:旋轉事件問題

這樣貌似就可以完成大多數的需求了,但是有時候我們會發現一些問題,比如當屏幕旋轉的時候事件無法傳遞

/**
 * 即將旋轉到某個屏幕時調用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@NYViewController---willRotateToInterfaceOrientation);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@NYViewController---didRotateFromInterfaceOrientation);
}

如果我們將這兩個方法寫到one two three這三個控制器中,相應的在屏幕旋轉的時候,只有主控制器打印了這個方法,然而其他的控制器中並沒有,這裡的原因就是他們的控制器是平級的,雖然view是父子關系,解決辦法就是設置controller的父子關系。

四:解決代碼

當控制器的view互為父子關系,那麼控制器最好也互為父子關系

  NYOneViewController *one = [[NYOneViewController alloc]init];

讓one控制器成為當前self(HWViewController)的子控制器

    [self addChildViewController:one];

通過關addChildViewController添加一個子控制器,那麼這個控制器就會被放到childViewControllers數組中
只要self在,childViewControllers數組就在數組裡面的子控制器就在

//
//  NYViewController.m
//  控制器的view的顯示
//
//  Created by apple on 14-10-10.
//  Copyright (c) 2014年 heima. All rights reserved.
//

#import NYViewController.h
#import NYTestViewController.h

#import NYOneViewController.h
#import NYTwoViewController.h
#import NYThreeViewController.h

@interface NYViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3;
@property (nonatomic, strong) NYTestViewController *test;

@end
@implementation NYViewController


/**
 * 即將旋轉到某個屏幕時調用
 */
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@NYViewController---willRotateToInterfaceOrientation);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    NSLog(@NYViewController---didRotateFromInterfaceOrientation);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //當控制器的view互為父子關系,那麼控制器最好也互為父子關系
    NYOneViewController *one = [[NYOneViewController alloc]init];
    //讓one控制器成為當前self(HWViewController)的子控制器
    [self addChildViewController:one];

    //通過關addChildViewController添加一個子控制器,那麼這個控制器就會被放到childViewControllers數組中
    //只要self在,childViewControllers數組就在數組裡面的子控制器就在

    NYTwoViewController *two = [[NYTwoViewController alloc]init];
    [self addChildViewController:two];

    NYThreeViewController *three = [[NYThreeViewController alloc]init];
    [self addChildViewController:three];
}




- (IBAction)vc1 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];

    [two.view removeFromSuperview];
    [three.view removeFromSuperview];
    [self.view addSubview:one.view];
}

- (IBAction)vc2 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];

    [one.view removeFromSuperview];
    [three.view removeFromSuperview];
    [self.view addSubview:two.view];
}

- (IBAction)vc3 {
    NYOneViewController *one = self.childViewControllers[0];
    NYTwoViewController *two = self.childViewControllers[1];
    NYThreeViewController *three = self.childViewControllers[2];

    [two.view removeFromSuperview];
    [one.view removeFromSuperview];
    [self.view addSubview:three.view];
}
@end

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved