以下是在iOS中最简单的界面切换示例。使用了多个Controller,并演示Controller之间在切换界面时的代码处理。
实现的应用界面:
首先,创建一个window-based application,即:
这个内容和编写最简单的Mac图形应用是类似的,本文针对iOS。之前写iOS视图代码,基本是手工代码实现的。实际上IB是个很好的工具。以下演示怎样通过IB编写最简单的iOS应用。
应用实现的效果:
点击提交,会打印日志:
2011-05-31 14:38:46.536 iPhoneDemo[16420:207] User name: zhangsan
实现了一个最简单的应用。目的是理解Mac/iOS的Interface Builder(IB)使用机制。
应用只有一个窗口,窗口中有一个文本框,一个按钮。在文本框中输入文字,点击提交,控制台窗口中会打印输入的文字。
日志引用
Category是ObjC语言中的扩展机制之一,另一个为Protocol。
Category提供一种为某个类添加方法而又不必编写子类的途径。
假设有这样一个类CarInfo:
#import <Foundation/Foundation.h>
@interface CarInfo : NSObject {
}
-(void)sayCarBrand;
@end
@implementation CarInfo
-(void) sayCarBrand{
NSLog(@"Car brand: Golf");
}@end
这是在ios开发中常见的功能。即,touch移动事件,是移动到当前视图的子视图中,还是移动到当前视图以外了。
办法是,继承UIView,覆盖touchesMoved方法:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
if (![self pointInside:[touch locationInView:self] withEvent:nil]) {
NSLog(@"touches moved outside the view");
}else {
UIView *hitView=[self hitTest:[[touches anyObject] locationInView:self] withEvent:nil];
if (hitView==self) {
NSLog(@"touches moved in the view");
}else{
NSLog(@"touches moved in the subview");
}
}
}
通过xcode编写代码,代码的头部会有类似下面的内容:
在xcode 3.2.x之前,需要命令行设置变量。比如《objective-c基础教程》第七章中提到的方式。
之后,可以通过xcode的配置项操作了。操作步骤见下面图示:
在java语言里,可以通过如下代码来实现加载类的时候执行对类的操作,一般叫:类初始块,或者,类加载块。比如:
public class MyClass{
static{
……
}
}
在objc语言里,对应的机制是,类方法,load和initialize。
比如:
#import "Constants.h"
@implementation Constants
+ (void)initialize{
NSLog(@"init constants >>>>>>>>>>");
}+ (void)load{
NSLog(@"load constants >>>>>>>>>>");
}@end
两个方法有一些不同。
在在objc项目中使用常量的最佳实践中的常量,是指可用于全局的常量。如果只是在文件内部使用,不希望之外的地方能访问到,就需要:
#import "BasicDemosViewController.h"
#import "Constants.h"NSString * const kMyURL=@"http://marshal.easymorse.com";
@implementation BasicDemosViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"load view: %@, %@",kInitURL,kMyURL);
}
之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量。比如,可以做个头文件,然后在需要的类文件中import,使用常量。
但这不是最佳实践。这样做可能是最好的方式,首先在比如叫Constants.h的头文件中:
#import <Foundation/Foundation.h>
extern NSString * const kInitURL;
@interface Constants : NSObject {
}
@end
这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。
在objc的约定里,常量也是大小写混排的驼峰命名规则,首字母小写,另外,第一个字母是k。
然后,在Constants.m文件中:
#import "Constants.h"
NSString * const kInitURL = @"http://marshal.easymorse.com";
@implementation Constants
@end
在这里给常量kInitURL赋值。
如何使用常量?只需在所需的m文件引入Constants头文件,下面是使用示例:
#import "BasicDemosViewController.h"
#import "Constants.h"@implementation BasicDemosViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
NSLog(@"load view: %@",kInitURL);
}
使用这种方式,比通过宏预定义的优点是,可以对常量进行指针比较操作,这是#define做不到的。即:
[myURL isEqualToString:kInitURL];
日志引用
svn可以还原到以前版本,一般来说有两种情况:
- 修改,但尚未提交,还原是取消当前修改,还原到主干的上一个版本
- 修改并提交了,需要还原到之前的指定版本
这里介绍的是第一种情况。其实在eclipse和windows环境下都有图形工具可以很容易的实现。以至于我都记不住命令。
要感谢xcode糟糕的svn支持,帮助我们不在命令行方面能力退化。
我在xcode环境下有关svn的一切操作都使用命令行。
svn revert –recursive .
该命令可在当前目录下,递归还原版本到主干的最后一个版本。