本文纯属自己记载自己的学习历程。可能每个人的感受和经历不一样。所以仅供大家随便看看,不要当真就好,认真你就输O(∩_∩)O~
我刚开始学苹果开发是公司需要,由于没人带,也就看着书上的例子,一个个拖控件拖得不亦乐乎,发现苹果程序还是蛮好写的,拖几下控件就能完成很多功能,但是一直没有大的进步,因为拖控件,而不是纯代码写的,控件为什么要这样拖,为什么这一样设置类都不知道,只能像背书一样做,一旦有一点不同,可能就弄不出来,而且只会去一个个比较,而不是去找问题,所以说刚入门用IB拖控件对新手是相当不利的,闲话少说,回到正题。
现在我创建一个名为Simple的project,后面所讲的都以这个工程名来说.
iPhone开发建工程,基本没有一个工程是完全空的,都是至少给了你mainviewcontroller.xib和一个你建的工程的appdelegate(SimpleAppDelegate),这些东西是干什么用的呢,iPhone开发的程序是怎样启动的呢,入口是哪里呢?接下来让我们一步步去分析。
首先,我把有这个空的Project的运行步骤大致描述下,首先运行main函数,运行到UIApplicationMain后,系统就知道去Simple-Info.plist中寻找,然后找到了MainWindow.xib,于是就运行,在MainWindow.xib中设置了他的代理为SimpleAppDelegate,于是启动SimpleAppDelegate函数,在SimpleAppDelegate.m中的didFinishLaunchingWithOptions方法里面将主界面进行设置,然后工程完成启动.
现在我们从头开始写一个简单的iPhone程序。以纯代码的方式来向大家呈现(可以参照前面xib的实现).
删掉所有东西: main函数;
Simple-Info.plist中Mainnibbaswname那一行;
MainWindow.xib;
SimpleAppDelegate的.h和.m文件。
第一步:首先写main函数
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv,nil , @"SimpleAppDelegate");
[pool release];
return retVal;
}
int retVal = UIApplicationMain(argc, argv, nil, nil);
这一行的时候,大家注意,UIApplicationMain一共有4个参数,前面两个不多说大家知道,重要的是第3,4个参数,第三个参数指的是主类(一个UIApplication的子类,一般为nil就可以了,也可以自己定义一个继承自UIApplication的类SimpleApplication,然后使用[SimpleApplication description]当第三个参数),重点来了,第四个参数是真正做事的类,他是一个代理(也就是前面说的SimpleAppDelegate),指定SimpleAppDelegate程序才能知道接下来是哪个函数来工作,iPhone开发中UIApplication类自己是不做事的,他把所有的事都让他的代理去做.
第二步创建一个SimpleAppDelegate类(基于NSObject的)
#import <UIKit/UIKit.h>
@interface SimpleAppDelegate : NSObject<UIApplicationDelegate> {
}
@end
可以看到我在类中添加了UIApplicationDelegate,这是因为SimpleAppDelegate必须实现UIApplicationDelegate的方法,而UIApplicationDelegate具体有哪些方法是由系统帮你已经确定好的,所以可以说任何一个iPhone程序都需要实现UIApplicationDelegate这个代理,这样我们就是用纯代码建立了一个完全空的程序
接下来,我们用这个空的project来实现在界面上显示一个Hi,APPLE ,
首先我在.m文件里实现UIApplicationDelegate的一个方法applicationDidFinishLaunching:这个方法是程序启动时调用的.我在 里面实例化了一个window,因为我们需要一个主窗口
#import "SimpleAppDelegate.h"
@implementation SimpleAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication*)application{
UIWindow * window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
[window makeKeyAndVisible];
}
新建一个类NewViewController(基于NSObject)
#import <UIKit/UIKit.h>
@interface NewViewController : UIViewController {
}
@end
因为要显示在界面上,所以继承了UIViewController
#import "NewViewController.h"
@implementation NewViewController
-(void)loadView
{
[super loadView];
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30)];
label.text = @"Hi,APPLE";
[self.view addSubview:label];
[label release];
}
@end
这样一个纯代码的工程完成,在界面上显示了Hi,APPLE,view的默认颜色的黑色的,如果想换颜色可以在NewViewController.m的loadView中使用 self.view.backgroundColor = [UIColor yellowColor];
来设置背景色
以下是关于 UIApplicationDelegate的知识,(来源于不知名网友前辈)看了就知道我为什么要用- (void)applicationDidFinishLaunching:(UIApplication*)application这个方法
UIApplicationDelegate是一个协议定义,同样SampleDelegate也需要实现UIApplicationDelegate中 定义的方法,只是这个协议是系统定义好的(具体可以参看UIApplicationDelegate.h)而SimpleProtocol是我们自己定义 的,但是要做的事情相同,就是SampleDelegate需要去实现这UIApplicationDelegate协议定义好的方法, 这些方法就是UIApplication对象监听到系统变化的时候通知UIApplication对象代理类SampleDelegate执行的相应方 法。下面是SampleDelegate的实现代码写在SampleDelegate.m中:
@implementation SampleDelegate
- (void)applicationWillResignActive:(UIApplication *)application{}
- (void)applicationDidBecomeActive:(UIApplication *)application{}
- (void)applicationDidEnterBackground:(UIApplication *)application{}
- (void)applicationWillEnterForeground:(UIApplication *)application{}
- (void)applicationWillTerminate:(UIApplication *)application{}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}
- (void)applicationSignificantTimeChange:(UIApplication*)application{}
- (void)applicationDidFinishLaunching:(UIApplication*)application{}
- (void)application:(UIApplication*)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{}
- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration{}
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{
return YES;
}
- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation{}
- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame{}
@end
现在来看协议中定义的这些需要实现的方法分别是什么作用:
1、- (void)applicationWillResignActive:(UIApplication *)application
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
2、- (void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
4、- (void)applicationWillEnterForeground:(UIApplication *)application
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)application
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键 值。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清 理工作防止程序被终止
7、- (void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
8、- (void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar框将要变化时执行
10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
说明:当通过url执行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。