【新葡京8455】iOS学习之控制器的创建,Xib加载的

作者:澳门新葡京平台游戏

一,本质

本次博客是一篇总结性质的博客,总结的是各种创建控制器的方式以及一些需要注意的操作。

xib本质是XML代码(在编译时Xcodexib中内容转换成代码)

1、通过storyboard创建控制器

新葡京8455 1

 正如我上一篇博客中所说,当 Main Interface 没有选定的时候,我们一般只能通过代码来创建一个 UIWindow,不再使用系统创建好的 Main.storyboard。

 通过 storyboard 创建控制器也是在 Main Interface 没有选定的时候,但是我们还使用系统创建好的 Main.storyboard,通过不同的方法来创建窗口的根控制器。

  • 第一步:在 AppDelegate.m 文件的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中先初始化一个 UIWindow 对象,代码如下:

    // 创建窗口
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
  • 第二步:创建一个 UIStoryboard 对象并将其初始化为 Main.storyboard

  初始化方法:

// 参数1:storyboard文件名,不需要带后缀
// 参数2:置为nil时表示[NSBundle mainBundle]
  (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;

  实例代码:

    // 加载storyboard
    // storyboard文件名,不需要带后缀,初始化为 Main.storyboard,name就是Main
    // nil:  [NSBundle mainBundle]
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  • 新葡京8455,第三步:通过storyboard创建控制器

  ① 指定箭头指向的控制器为窗口的根控制器

  方法:

// 加载箭头指向的控制器
- (nullable __kindof UIViewController *)instantiateInitialViewController;

  实例代码:

    // 通过storyboard创建控制器
    // instantiateInitialViewController:加载箭头指向的控制器
    UIViewController *vc = [storyboard instantiateInitialViewController];

   实例图:

新葡京8455 2

  如上图:我们将粉色背景的控制器设置为默认 Main.storyboard 的控制器,当我们使用上述代码时,程序运行的效果是:如下图的一个粉色窗口

新葡京8455 3

  ② 通过 Storyboard ID 来创建根控制器

  方法:

// 参数为:Storyboard ID 的字符串
- (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;

  实例代码:

// 通过 Storyboard ID 创建控制器
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"green"];

  正如 ① 中所示的图,我们将绿色背景的控制器的 Storyboard ID 置为 "green",但是Main.storyboard 的默认控制器仍然为粉色背景的控制器,使用上述实例代码,运行结果为如下图的一个绿色窗口

新葡京8455 4

  具体如何设置视图控制器为 UIWindow 对象的根视图控制器以及将 UIWindow 对象作为主窗口并可见,请参考上一篇博客。

注:如果一个view是从xib中加载出来的,默认widthheightxib中描述的尺寸,frame中值默认为零

2、通过xib创建控制器

 通过 xib 创建控制器也是在 Main Interface 没有选定的时候,自己在 AppDelegate.m 文件中对应的方法中先初始化一个 UIWindow 对象。

 创建xib的方法:

  ① 在创建一个视图控制器的类的时候,将 Also create XIB file 选中之后,就会创建出来一个和控制器类对应的xib,如下图:

新葡京8455 5

    这种方法创建的xib的名字与所对应的类名相同。

  ② 创建一个名字可以自定义的 xib

新葡京8455 6

  创建后的设置:(具体如下图)

   (1)选择文件所有者选项

   (2)绑定控制器

   (3)绑定xib视图

新葡京8455 7

 

  通过xib创建根控制器的方法是一个控制器的初始化方法,实例代码:

    // 通过xib创建控制器
    ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

  加载xib的特殊写法:

    // 特殊写法1:
    UIViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
    // 特殊写法2:
    UIViewController *vc = [[ViewController alloc] init];

  以上 xib 的特殊写法加载 xib View 视图的底层实现:

   如果描述控制器 View 的 xib 跟控制器的类名相同,就会去加载

   只有控制器的 init 方法底层会调用 initWithNibName:bundle:

   只要通过 initWithNibName:bundle: 初始化控制器,并且 nibName 为 nil ,就会执行以下几步:

   (1)先寻找有没有跟控制器类名同名但是不带Controller的xib,如果有就会去加载(XMGView.xib)

   (2)如果没有就寻找有没有跟控制器类名同名的xib,如果有就会去加载(XMGViewController.xib)

   (3)如果都没有找到,创建空的view,

 

二、控制器中加载xib

加载方式一:

NSArray *newsArr = [[NSBundle mainBundle] loadNibNamed:@"news" owner:nil options:nil];UIView *newsView = newsArr.firstObject;

注:“loadNibNamed:owner:options” 方法返回值是一个NSArray,因为一个xib中可以放多个view,但一般情况我们都只放一个在xib

加载方式二:

UINib *nib = [UINib nibWithNibName:@"news" bundle:[NSBundle mainBundle]];//[NSBundle mainBundle]作为参数时,可以传nil,切记[NSBundle mainBundle]调用其他方法时不可以为nil,用nil调用方法等于什么操作都没做UIView *news = [[nib instantiateWithOwner:nil options:nil] firstObject];

三、使用xib加载view的注意事项

1,如果一个view是从xib加载出来的,那么xib绑定的View初始化过程中,不会执行init方法和initWithFrame方法,因此在页面中如果通过 alloc init 来初始化该view,界面会是空白2,如果多个页面中用到该view,最好在xib绑定的类中提供快速创建的类方法

  (instancetype)viewForXib{ return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass owner:nil options:nil] firstObject];}

本文由新葡京8455发布,转载请注明来源

关键词: