`
fosa0989
  • 浏览: 110242 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS常用的几个基础类 一个不用xib文件的例子

阅读更多

我们从这张图开始说吧。从这张图我们可以很清楚的看到iOS开发的MVC结构。UIApplication,Application Delegate 和 View Controller都是控制器。UIWindow和各种其他的UIView都是视图。

1。 程序的启动函数UIApplicationMain

 该函数主要创建一个UIApplication对象和一个UIApplicationDelegate对象,并且设置事件循环,然后开始处理事件。

int UIApplicationMain (
   int argc,
   char *argv[],
   NSString *principalClassName,
   NSString *delegateClassName
);

 该函数有四个参数,前两个我们都很熟悉了。第三个函数是UIApplication类的名字,如果为空程序会自动创建一个UIApplication的实例。第四个函数是,UIApplicationDelegate类的名字,如果为空系统会从Main xib文件寻找。

如果不用Main xib文件呢? 那就必须自己指定一个了,总不能让程序启动无门吧。

 

首先,我们先用一个不使用xib文件的例子来看看UIApplicationDelegate,UIWindow,UIViewController和UIView是怎么连起来的。我们的例子自定义了Test2AppDelegate(和项目创建的TestAppDelegate区别开),MyViewController和MyView及个类。

首先,创建一个window-based的项目。因为我们不用xib文件,所以删除plist文件中NSMainNibFile这一项和对应的value。然后,设置UIApplicationMain函数的第四个参数为指定的Delegate的名字。

int retVal = UIApplicationMain(argc, argv, nil, @"Test2AppDelegate");
 

2。UIApplicationDelegate

为了区别于项目自动生成的UIApplicationDelegate类,我自己定义了Test2AppDelegate类。

#import <Foundation/Foundation.h>

@interface Test2AppDelegate : NSObject <UIApplicationDelegate>{
    UIWindow *window;
    UIViewController *viewController;
}
@property (nonatomic, retain) UIWindow * window;
@property (nonatomic, retain) UIViewController *viewController;
@end

 从代码可以看到,该类继承NSObject并实现了UIApplicationDelegate协议。

这个协议的方法提供了UIApplication的关键事件信息,比如完成加载,即将关闭或者内存不足。实现对应的方法就可以对这些事件进行处理。

代理类的重要之处还在于对程序的状态转换做出相应的处理。比如程序完成加载后会调用application didFinishLaunchingWithOptions。我们在这个方法里面创建一个UIWindow,否则程序会显示黑屏。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    CGRect appFrame = [UIScreen mainScreen].applicationFrame;    // Override point for customization after application launch.
    window = [[UIWindow alloc] initWithFrame:appFrame];
    viewController = [[MyViewController alloc] initWith_Frame:appFrame];
    [window addSubview:viewController.view];
    [self.window makeKeyAndVisible];
    return YES;
}

 3。UIWindow

UIWindow是所有视图的根,每个程序里只有一个UIWindow实例。它定义了管理并协调窗口在屏幕上显示的对象。它的两个主要功能是分发事件给UIView对象和提供显示视图的区域。

4。UIViewController

UIViewController提供了基本的View管理模型。每个实例管理一个View hierarchy(层次结构)。我们定义的UIViewController如下所示。

#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController {
    CGRect frame;
}
@property (nonatomic) CGRect frame;
- (id) initWith_Frame:(CGRect) _frame;
@end

 用户也可以用其他已经定义的视图控制器,比如UITabBarController,来管理更复杂的视图层次结构。

如果要使用xib文件来定义UIViewController的视图,必须调用initWithNibName: bundle方法来初始化。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

 注意:每次用xib文件都别忘了connection。要想让xib文件视图不显示为黑屏必须做两件事情。

 a)设置File‘s owner 为我们定义的MyViewController。点File’s Owner在Identity Inspector窗口设置Customer class。

 b)建立xib文件和File‘s Owner(MyViewController)的view的连接。在File’s Owner的Connection Inspector窗口中,Outlets中的view上拉一条线到左面Objects列表的view。(xcode 4)

如果使用自定义的UiView,必须继承loadiew方法来加载视图。

另外,用xib文件就表定义loadView方法了,不然也可能会显示黑屏。

- (void)loadView
{
    UIView* myV = [MyView alloc];    
    [myV initWithFrame: frame];    
    [self setView: myV];    
    [myV release];
}

 5。UIView

如果不用xib文件而是自定义视图,就要实现drawRect方法自己画。

- (void)drawRect:(CGRect)rect
{
    CGContextRef X = UIGraphicsGetCurrentContext();    
    
    CGRect bounds =  CGContextGetClipBoundingBox(X);
    CGPoint center = CGPointMake((bounds.size.width / 2), (bounds.size.height / 2));
    
    CGContextSetRGBFillColor(X, 0.9,0.9,0.9, 0.8f);
    CGContextFillRect(X, bounds);
    
    char* text = "GaGa... NO XIB! Hello iOS!";
    CGContextSelectFont(X, "Helvetica Bold", 32.0f, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(X, kCGTextFill);
    CGContextSetRGBFillColor(X, 0.1f, 0.3f, 0.8f,  0.85f);    
    CGAffineTransform xform = CGAffineTransformMake(
                                                    1.0f,  0.0f,
                                                    0.0f, -1.0f,
                                                    0.0f,  0.0f   );
    CGContextSetTextMatrix(X, xform);    
    CGContextShowTextAtPoint(X, 0, center.y, text, strlen(text));
}

 

OK。That‘s all!欢迎多多交流!

 

分享到:
评论

相关推荐

    IOS应用源码Demo-一个选择器特效大全的例子:KNMultiItemSelector-毕设学习.zip

    在iOS开发中,选择器(Selector)是一种常见且重要的组件,它允许用户在多个选项中进行选择。在iOS应用源码Demo"KNMultiItemSelector"中,开发者提供了一个选择器特效大全,这对于学习iOS开发,尤其是毕业设计和论文...

    iOS纯手写代码小例子

    本教程将通过一系列小例子,详细介绍如何在iOS中手工创建用户界面(UI)元素,特别关注于一些常用控件的实现。我们将探讨以下几个关键知识点: 1. **自定义视图(Custom Views)**: 在iOS中,UIView是所有视图的...

    IOS应用源码——Core Animation例子……NanoLife for iPhone nanolife.rar

    在NanoLife项目中,我们预计会看到Core Animation在以下几个方面发挥作用: - **视图动画**:可能通过修改CALayer的属性(如位置、透明度或旋转)来创建平滑的动画效果。 - **图层组合**:通过组合多个CALayer,...

    iPhone开发入门基础 全部例子代码

    4. ** storyboard 和 XIB 文件**:这些是iOS应用的界面布局文件,用于设计和连接UI元素。了解如何通过拖拽方式创建视图,以及如何使用Auto Layout进行动态布局。 5. **事件处理和手势识别**:了解如何响应用户的...

    SpeedDial.zipIOS应用例子源码下载

    2. **UIKit框架**:iOS应用的用户界面主要通过UIKit来构建,包括UIControl、UIViewController、UILabel、UIButton等控件的使用,以及Storyboard和XIB文件的布局。 3. **数据存储**:可能涉及Core Data或...

    iphone视图控制器例子

    它是苹果提供的一个基础类,用于处理屏幕上的视图、用户交互以及其他视图控制器的协调。`UIViewController`提供了许多功能,如显示和隐藏导航栏、工具栏,处理屏幕旋转等。在iOS应用中,几乎每个屏幕都会由一个或多...

    WorldCities.zipIOS应用例子源码下载

    首先,我们可以推断出这个应用可能涉及到以下几个关键知识点: 1. **Swift编程语言**:iOS应用程序通常使用Swift编写,这是一种由Apple推出的现代化编程语言,以其简洁、安全和高性能著称。通过分析源代码,开发者...

    iphon开发秘笈

    分段控件允许用户在几个选项之间切换,常用于过滤或分类功能。 **3.6 秘诀: 在导航栏中添加UIToolbar** 在导航栏中添加工具栏可以提供额外的操作选项。 **3.7 秘诀: 在视图控制器之间导航** - **返回根**:返回...

    iphone 实例 tableview 04

    在iOS开发中,UITableView是展示数据的常用控件,它以列表的形式呈现信息,而"iphone 实例 tableview 04 04-Cell Kinds.rar"是一个关于使用UITableView的实例,特别关注了不同类型的Cell。在这个项目中,开发者可能...

    SecondKadaiApp

    总的来说,"SecondKadaiApp"是一个学习和实践Swift编程的好例子,涵盖了从基础语法到实际应用开发的各种知识点。通过研究这个项目,开发者可以深入理解Swift语言特性,并掌握iOS应用开发的基本流程。

    DropDownMenu:仿美团下拉菜单,二级菜单

    在Objective-C中创建这样一个下拉菜单涉及到几个关键知识点: 1. **UIControl**:下拉菜单的基础是UIControl,它是所有控制类的基类,提供了事件处理和自定义外观的能力。在这里,开发者可能会扩展UIControl来实现...

Global site tag (gtag.js) - Google Analytics