zoukankan      html  css  js  c++  java
  • 【转】loadView的用法,loadView创建基本界面,DidLoad读入数据

    loadview:

    //   有没有nib 只要是复写了loadview loadview都会被执行     有nib文件的话加载的是nib文件的view  没有的话会按照loadview里的代码加载

    也就是说程序先会执行loadview方法,然后再去加载nib文件。

    UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问。但没有调用loadView方法时,self.view=nil。loadView 在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view。这个接口原 本是为了让我们自定义view用的。你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息。 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。

    [super loadView]的效果,就是产生了一个有效的view,也就是一个空白的view来保证view在使用时不为nil,但这并不是Cocoa的设计者所期望的。

    loadView仅仅应该在开发者希望自行通过编码而不是Interface Builder定制view的时候被实现,而且不应该在其中调用[super loadView],你的loadView中应该有self.view = …这样的行为。

    看两个例子:

    例子1、

    -(void) loadView {

    //[super loadView];

    NSLog(@"loadView Called");

    }

    - (void) viewDidLoad {

    [super viewDidLoad];

    UIButton *customButton = [UIButton buttonWith.....

    ......

    [self.view addSubView:customButton];

    }

    当 不使用IB来创建视图的时候,在viewDidLoad中使用view之前,系统会自动调用loadView来创建一个view,但例子1中的 loadView除了打印一句话之外什么都没干,所以loadView会被不同的调用,但程序仍不能正常运行,因为没有有有效的 view,self.view的值始终为nil。注意:我没有调用[super loadView],如果加上这句就可以了,这样会产生一个空白的view,但这不是苹果希望的。

    例子2、

    - (void)loadView

    {

        [super loadView];

        textView=[ [ UITextView alloc ] initWithFrame: [[ UIScreen mainScreen ] applicationFrame];

        textView.text=@"Hello";

        [self.view addSubview: textView];

    }

    - (void)loadView

    {

        textView=[ [ UITextView alloc ] initWithFrame: [ [ UIScreen mainScreen ] applicationFrame ] ];

        textView.text=@"Hello";

        self.view=textView;

    }

    两 段代码起到的作用相同,但前一个例子把textView加入到self.view中,而后者则让self.view直接指向了 textView。把textView加入到self.view中则self.view不能为nil,因此需要调用[super loadView]方法,后者不需要。

    显然,继承UIViewController的subclass要实现其load方法时,若采用添加view的方式,我们只要在loadView中增加一句[super loadView]就没有问题了。但这并不是Cocoa的设计者所期望的。self.view = …才是提倡的方式。

    看了一些大侠的帖子,有这么说的:

    {当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。

    如果手工维护views,必须重载重写该方法

    如果使用IB维护views,必须不能重载重写该方法}

    开始时对上述感觉很迷惑,我想这不是他想表达的本意

    self.view = [[[NSBundle mainBundle] loadNibNamed:@"OneNibName" owner:self options:nil] lastObject];

    我想在loadView中这样用也是可以的,我是手工维护view,但view是从IB中加载的。

    还有一点,和loadView一个界别的还有一个方法initWithNibName, 这个方法是在controller中的类在IB中创建,但是通过Xcode实例化controller的时候用的.(建立一个viewBase的模板工 程,然后打开MainWindow.xib,删除其中的viewController,然后回到viewController.m中,把第一个方法 initWithNibName注释取消掉,然后加入一条你喜欢的打印语句,试试是不是这样的)

    一般的用法是在loadView/initWithNibName里面创建基本的界面,然后在viewDidLoad里读入数据,然后根据数据再将各view设置为正确的状态。

    上述为个人参考网上资料学习后的个人理解,有错误的地方还望飘过的大侠批评指正,在此谢过。

  • 相关阅读:
    php RabbitMQ使用
    phalcon: 开启模板缓存和缓存路径
    phalcon:整合官方多模块功能,方便多表查询
    mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword
    php的http数据传输get/post...
    java大数字操作:BigInteger,BigDecimal(浮点型)
    DecimalFormat数据格式函数
    MySQL比like语句更高效的写法locate position instr find_in_set
    mysql中使用instr替换like
    mysql中的多行查询结果合并成一个
  • 原文地址:https://www.cnblogs.com/wengzilin/p/2406415.html
Copyright © 2011-2022 走看看