针对从ios5/6 升级到ios7 的viewcontroller的 生命周期调整说明;

来源:互联网 发布:linux dd将img 编辑:程序博客网 时间:2024/05/21 11:23

若工程比较老,是ios5/6的工程,现在要升级,项目庞大, 在一个viewdidload 里面,写有庞大的 成员属性初始化,比如数组,视图初始加载,比如 addsuview等;


有在另外一个controller里面 跳转到本视图controller,用的是pushviewcontroller;  在push的代码之后,紧跟着的是本controller的 刷新UI的方法;

形如:

PromotionsContentViewController *viewcontroller = [[[PromotionsContentViewControlleralloc]init]autorelease];

 [self.navigationControllerpushViewController:viewcontroller animated:YES];

    [viewcontroller     displayPromotionsObject:promotions];


在ios7 之前,即使不用xib,这样也是没什么问题的;

因为viewcontroller 的viewdidload 方法,会在push 之后,紧接着就会执行;但是ios7 不用xib的就不是这样。。viewdidload 大多数情况下,会在 displayPromotionsObject这句代码之后执行。。这样就会造成刷新UI的时候,成员属性或者视图view 并没有被初始化,造成push 进来一个空白的或者是一个没有刷新的 默认的界面,因为viewdidload 在display 之后调用............


notes:  使用xib的controlller 不存在这个问题;;


如果你的viewdidload 代码太过复杂,逻辑牵扯太多 ;;这里提供一个偷懒 但是稍微有些不安全的方法;


1/ 添加形如以下代码

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization

        [self viewDidLoad];  // 这句是关键,强制显示调用 ,第一次自定义调用

    }

    return self;

}

2/ 在viewdidvoad 头部,添加以下代码

-(void)viewdidload{

 if (self.view.subviews.count>=1) {

        return;    // 规避第二次的系统调用

    }

[super viewdidload]; // 这句代码, 也可以注释掉

}


0 0