iOS Programming Recipe 6: Creating a custom UIView using a Nib

简介:

iOS Programming Recipe 6: Creating a custom UIView using a Nib

Submit to reddit Submit to StumbleUpon Share

 

Creating a custom UIView using a Nib

Assumptions
  1. You are familiar with creating UIView subclasses, and instantiating UIView’s both from a Nib file or in code
  2. You are familiar with Nib files
Background

Sometimes you find yourself trying to create a quick composite UIView (UIView subclass w/ multiple subviews) where a UIViewController doesn’t seem necessary Please note that a UIViewController is the right choice most of the time. This can be a real pain to setup entirely in code if you have many subviews, and god forbid if you want to use auto layout! So you may find yourself wanting to use a nib to simplify things a bit, well this tutorial will go through the process of doing just that.

Getting Started
  • Create a new Xcode project based on the single view application template for iOS. This tutorial will assume you are using ARC, so you may want to make that selection when creating the new project.
  • Once you have created the new project a new UIView subclass to the project and name itCustomView.
  • Then create a new Nib file named CustomView.nib and add it to the project.
 
Setup the UIView Subclass (using a nib)
  • Open the newly created nib and add a UIView to it.
  • In the Attributes Inspector under the Simulated Metrics section, click the size drop-down menu and select none, this will allow you to resize the UIView to whatever size you like.
  • Resize the view to something like 200×300.
  • With the newly added UIView selected open the Identity Inspector and change the classname to CustomView matching the one you previously created.
  • Add a UILabel as a subview of the view and change the title to My Custom View. Then center it in the view, it should resemble the one shown below.

1

Creating a Convenience Initializer

Next we will create a convenience initializer in the CustomView class that will load the CustomView from the nib instead of creating it in code

  • Open CustomView.h and add the following class method definition.
+  ( id )customView;
  • Next open CustomView.m and implement the class method as shown below (Please keep in mind this is a very basic implementation for our basic UIView subclass, you can alter it to your liking)
+  ( id )customView
{
    CustomView  *customView  =  [ [ [ NSBundle mainBundle ] loadNibNamed : @ "CustomView" owner : nil options : nil ] lastObject ];

     // make sure customView is not nil or the wrong class!
     if  ( [customView isKindOfClass : [CustomView class ] ] )
         return customView;
     else
         return  nil;
}
Finishing The Demo App
  • Open ViewController.m and add the following viewDidLoad method, this will use our convenience initializer to create a CustomView and then we add it to our view hierarchy. You will also need to import CustomView.h in ViewController.m.
-  ( void )viewDidLoad
{
     [super viewDidLoad ];

    CustomView  *customView  =  [CustomView customView ];
     [self.view addSubview :customView ];
}
Code Explanation
    1. First we access the main bundle and load the nib we created.
    2. loadNibNamed:owner:options: returns an NSArray containing each of the top level objects in the nib. Since in our case we know there should only be one top level object (CustomView as we specified earlier) we can then call lastObject on the array. lastObjectis used in order to safely access the array in case loadNibNamed:owner:options: failed. Note that lastObject returns nil if the array is empty.
    3. Finally we ensure that customView is actually a “CustomView” not some other class or nil.
That’s It!

As always if you have any suggestions for future recipes, or any questions or comments, please let us know!

 

 

 

COMMENTS

  1. Mihai Damian  says:

    One potential drawback with of approach is that you cannot directly link IBOutlets from the Nib since you have no file owner for it. Of course you could grab the subviews by tags and assign them yourself but this is error prone since it’s much more difficult to keep track of tags. Alternatively you could create an extra “template” instance of CustomView, set it as the file owner and then do the manual IBOutlet assignment from the template instance to the actual instance that you’ll be returning. This has the advantage of explicitly naming the UIViews you’re working with but it feels a bit hackish and it takes the most effort to implement.

    • Mike Turner  says:

      Thanks for the comment!

      You can actually link up IBActions & IBOutlets, although it is slightly different than with a UIViewController. Using the example above add this property declaration to CustomView.h.

      //This will link to the label in CustomView.xib
        @property  (nonatomic, strong ) IBOutlet UILabel  *label;

      Now in CustomView.xib, (control + drag) from the top level object (our CustomView object, where the property declaration lives, instead of file’s owner) to the UILabel. You should be presented with a HUD allowing you to select the “label” outlet just created!

      I’ll append the post to show this process.

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/3700509.html
相关文章
|
存储 自然语言处理 文件存储
iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)
iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)
386 0
iOS小知识:nib本地化、图片本地化字符串本地化(APP 内的本地化切换)
|
存储 自然语言处理 文件存储
iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化
iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化
252 0
iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化
|
iOS开发 Windows
iOS Programming - Views(视图 - 基本绘制,变换,平移,旋转,反转,倾斜)
1. Views A view (an object whose class is UIView or a subclass of UIView) knows how to draw itself into a rectangular area of the interface.
1023 0
|
图形学 API C语言
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记12 Custom Views视图绘制1
这一话来讲解一下视图的绘制,首先介绍一下相关的结构体 视图中的所有coordinate(坐标)的类型都是CGFloat,CGFloat在Swift中是结构体,在处理视图绘制和手势识别的时候我们使用的都是CGFloat,不要用我们常规的Double和Float。
952 0
|
Swift iOS开发
swift语言IOS8开发战记4.custom tableViewCell
第三话中讲解了如何利用系统内置的cell格式,这一话来谈谈如何自定义cell格式.在stroyboard中通过拖拽为cell添加内容,并且通过属性检测器修改样式,下面是我简单设置的一个自定义cell。
969 0
|
数据库 iOS开发 存储
iOS 地址簿编程指南(Address Book Programming Guide for iOS)
iOS 地址簿编程指南(Address Book Programming Guide for iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
1275 0
|
iOS开发
iOS开发那些事-关于性能优化–选择nib还是故事板的讨论
故事板是苹果在iOS5之后推出的技术,本意是集成多个nib文件于一个故事板文件,管理起来方便,故事板还能反应控制器之间的导航关系,很多导航是需要连连线就可以了,不需写代码,使用起来很方便。但是我告诫读者,从内存占用角度看故事板不是一个好的技术。 <p>为了比较我们使用Xcode中的Master-Detail模板分别创建,基于故事板的应用StoryboardDemo和基于nib的应用Nib
1149 0