読み込んでいます...

在开发应用程序的时候,特别是当今网络特别充足和重要的时候,网络应用和桌面应用史无前例的整合起来,其界限也越来越模糊。所以网络应用可以向桌面应用开放API,然后桌面应用去调用,这样可以方便的维护一份代码,并且可以push更新到用户手里。

而在设计的时候,通常情况下都是客户端发送相应的Http请求,并包含某些内容,发送完毕之后,等待服务器端的响应。而在服务器端,得到请求的内容并生成相应的结果返回即可。虽然这个过程很好理解,很简单,但是在Mac和iPhone开发上,还是有点麻烦,而且国内资料又少,所以这里我写一下如何实现发送HttpRequest请求,方便后面的同学。

这段代码可以适用与Mac OS X和iPhone应用。

界面我就用Mac的桌面应用做,因为简单,效果一样,界面可以做成如下模样,如何连接就各位自己去连接了,我前面的文章说的很明白了。

当我们按下按钮的时候,就去获取相应的网站/服务器的返回的请求。调用方法如下。

- (IBAction)buttonClicked:(id)sender
{
    NSString
*receive = [RequestSender sendRequest:@"http://wt.jguoer.com"];
    textbox.title
= receive;
    NSLog(
@"Clicked");
}

RequestSender是我写的一个类,这个类就是用于发送Http请求的,具体代码如下。 

#import <Cocoa/Cocoa.h>

@interface RequestSender : NSObject {

}

+ (NSString*)sendRequest:(NSString*)url;

@end

实现代码如下所示,我已经写了详细的注释了,所以我就不需要再多说什么了。

+ (NSString*)sendRequest:(NSString*)url
{
    
//准备发送httprequest
    NSString *urlString = url;
    NSMutableURLRequest
*request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:
@"GET"];
    
    
//设置http头
    NSString *contentType = [NSString stringWithFormat:@"text/xml"];
    [request addValue:contentType forHTTPHeaderField:
@"Content-Type"];
    
    
//创建http内容
    
//NSMutableData *postBody = [NSMutableData data];
    
//[postBody appendData:[[NSString stringWithFormat:@"<xml>"] dataUsingEncoding:NSUTF8StringEncoding]];
    
//[postBody appendData:[[NSString stringWithFormat:@"<your xml format code here/>"]
    //dataUsingEncoding:NSUTF8StringEncoding]];
    
//[postBody appendData:[[NSString stringWithFormat:@"</xml>"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
//设置发送内容
    
//[request setHTTPBody:postBody];
    
    
//获取响应
    NSHTTPURLResponse* urlResponse = nil;  
    NSError
*error = [[NSError alloc] init];  
    NSData
*responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
    NSString
*result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    
    
//返回的http状态
    NSLog(@"Response Code: %d", [urlResponse statusCode]);
    
    
//获取返回的内容
    if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300)
    {
        NSLog(
@"Response: %@", result);
        
return result;
        
//执行你想要的内容,代码可以写在这里
    }
    
    
return @"Return value";
}

我们获取的result就是我们想要的HttpResponse了,这样就成功发送了一个请求并获取了相应的内容。

HttpRequestMac.zip (29.12 kb)

在开发应用程序的时候,当然需要经常的实用数据库进行数据的保存了,在移动设备上,我们可以使用文件,数据库等方式去保存,为了能够让用户无法使用其他的程序去修改,我这里认为使用数据库的方式是一个很好的方式。在iPhone上面,我们可以使用SQLite进行数据的持久化。另外值得一提的是Firefox是使用数据库的方式保存的,同样也是SQLite。

在iPhone开发重,我们需要首先添加一个SQLite的库,XCode本身就支持的,我们在左边的Frameworks里面选择Add,然后选择Existing Frameworks,在弹出窗口中选择SQLite的库libsqlite3.0.dylib。

添加之后,我们就可以使用SQLite在iPhone中进行数据的保存,查询,删除等操作了。

现在我们可以写一个SQLite的Helper文件,方便我们在其他的代码中使用,头文件(SqliteHelper.h)如下。

#import <Foundation/Foundation.h>
#import sqlite3.h
#define kFileName @”mydatabase.sql”

@interface SqliteHelper : NSObject {

sqlite3 *database;
}

//创建表
- (BOOL)createTable;
//插入数据
- (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password;
//查询表
- (BOOL)checkIfHasUser;

@end

我们的代码文件如下。

#import SqliteHelper.h

@implementation SqliteHelper

- (BOOL)createTable
{
NSArray
*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString
*paths = [[path objectAtIndex:0] stringByAppendingPathComponent:kFileName];
NSFileManager
*fileManager = [NSFileManager defaultManager];
BOOL fileFinded
= [fileManager fileExistsAtPath:paths];

NSLog(@”Database file path is %@,paths);

if(fileFinded)
{
NSLog(
@”Database file existed);

if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(
@”Open Failed);
return NO;
}
}
else
{
NSLog(
@”Database file is not existed);

if(sqlite3_open([paths UTF8String],&database)!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(
@”Open Failed);
return NO;
}
}

char *errorMsg;

NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text);
if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(
@”Open failed or init filed);
return NO;
}

return YES;
}

- (BOOL)insertMainTable:(NSString*) username insertPassword:(NSString*) password
{
char *errorMsg;

NSString *createSQL = @”create table if not exists fields (userid integer primary key,username text,password text);
if(sqlite3_exec(database,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(
@”Open failed or init filed);
return NO;
}

NSString *insertData = [[NSString alloc] initWithFormat:@”insert or replace into fields (userid,username,password) values (%d,’%@’,'%@’),0,username,password];

if(sqlite3_exec(database,[insertData UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK)
{
sqlite3_close(database);
NSLog(
@”Open failed or failed to insert);
return NO;
}

return YES;
}

- (BOOL)checkIfHasUser
{
NSString
*getUserCountSQL = @”select * from fields;
sqlite3_stmt
*statement;

NSLog(@”checkIfHasUser);

if(sqlite3_prepare_v2(database,[getUserCountSQL UTF8String],-1,&statement,nil)==SQLITE_OK)
{
//while(sqlite3_step(statement) == SQLITE_ROW)
//{
// int row = sqlite3_column_int(statement,0);
// char* rowData = (char*)sqlite3_column_text(statement,2);
// NSString *fieldName = [[NSString alloc] initWithFormat:@”show%d”,row];
// NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
//
// NSLog(@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue);
// return [[NSString alloc] initWithFormat:@”fieldName is :%@,fieldValue is :%@”,fieldName,fieldValue];
//
// [fieldName release];
// [fieldValue release];
//}
//sqlite3_finalize(statement);

if(sqlite3_step(statement) == SQLITE_ROW)
{
NSLog(
@”Have user);
return YES;
}
}

NSLog(@”No user);
return NO;
}

@end

其中checkIfHasUser是检查数据,这个方法中我注释的是得到数据,因为我们这里只是check,所以不需要得到数据,直接看是否存在数据即可。上面的代码虽然没有过多的注释,但是代码本身已经很简单了,上下文也非常清楚,所以我就不写过多的注释了。

492路过 1评论 iPhone开发 阅读全文..

在上一篇文章中我们知道了如何去手动的写一个窗体,写一个默认的Controller并连接MVC这三个模块,在我们了解了之后,我们就能够通过一种方式去创建一个新窗体了,例如当我们希望在主窗体中按一个按钮打开一个新窗体的时候,我们就需要手动的去创建一个新窗体,首先,我们先把MainWindow的界面做成如下图所示。

然后我们再在MainWindowController头文件中写下如下代码,去连接我们的代码和UI。 

#import <UIKit/UIKit.h>

@interface MainWindowController : UIViewController {
    IBOutlet UIButton *button;
}

@property (retain,nonatomic) IBOutlet UIButton
*button;

- (IBAction)buttonClicked:(id)sender

@end

然后我们在内容文件中写下如下代码。

@implementation MainWindowController

@synthesize button;

- (IBAction)buttonClicked:(id)sender
{

}

我们上面的代码写了一个button控件,然后实现了,然后还写了事件,现在我们只要连接控件ui和事件就可以了。如下图,我们先连接我们的UI到控件(记住按住control),让编译器知道我们这个按钮是我们上面写的button。

连接完之后,我们还需要反向的连接一下,我们按住control,然后从button的事件中,选中Touch Up Inside,然后拖动到Main Window Controller中,然后选中buttonClicked,就连接了按钮的事件。

这样,我们就连接MainWindow和MainWindowController,现在我们就要先创建一个新的窗口,然后再通过这个按钮事件去打开一个新窗口,所以我们先创建一个新窗口并取名叫MyMainWindow。

我们在资源文件中添加一个新的View XIB文件,然后打开这个文件,编写一个基本的UI,如下图。

新的窗口创建好了之后我们就要为新的窗口写Controller文件,例如我们可以创建一个新的类叫MyMainWindowController,记住我们这里一定要创建一个继承自UI的应用类文件并取名叫MyMainWindowController。虽然没有说名字非要取MyMainWindowController,但是这样取名是非常有必要也有好处的,我们能够一眼就知道这个UI是哪个Controller去控制的。

在创建好之后,我们再编辑MyMainWindow,在NIB窗口中,我们打开File’s Owner,然后在类中,选择我们的Controller,如下图。

当打开时,有可能是默认继承自NSObject的,也有可能是MainWindowController,这里我们需要选的是MyMainWindowController,所以上面这个图是没有选择的,我们只需要在Class中选择相应的Controller即可,不过这里优先级不高。

当我们连接好UI和类文件之后,我们就创建了一个新的窗口,但是这里值得注意的有几点。

我们编写多窗口应用和创建View-based应用程序是不同的,我们创建的是Window-based应用程序。

View-based默认创建了一个View并默认连接了,而Window-based默认创建的是应用程序委托(相当于定义了main函数),并连接了。

因为Window-based是应用程序委托,所以要自己写Controller。

Window-based默认的Controller连接的是应用程序委托,所以要创建View的实例,连接Controller。

我们创建的View-based窗口(这里不是程序),不是连接委托,所以直接使用File’s Owner即可连接Controller。

大概了解了这些之后,我们就可以写按钮事件去打开新窗口了,代码如下。

#import <UIKit/UIKit.h>

@class MyMainWindowController;

@interface MainWindowController : UIViewController {
    IBOutlet UIButton *button;
    
MyMainWindowController *mywindow;
}

@property (retain,nonatomic) IBOutlet UIButton *button;
@property (retain,nonatomic) MyMainWindowController *mywindow;

- (IBAction)buttonClicked:(id)sender;

@end

写完头文件之后,我们还要写实现。

#import "MainWindowController.h"
#import "MyMainWindowController.h"

@implementation MainWindowController

@synthesize button;
@synthesize mywindow;

- (IBAction)buttonClicked:(id)sender
{
    
MyMainWindowController *controller = [[MyMainWindowController alloc] initWithNibName:@"MyMainWindow" bundle:nil];
    
    
if(self.mywindow == nil)
    {
        self.mywindow
= controller;
        [self.view addSubview:controller.view];
        [controller release];
    }

}

写完之后,我们就Build and GO GO GO,然后我们单击按钮,是不是就可以打开新的窗口了?是不是有点晕呼呼的,说实话把,我自己一开始看这东西的时候也觉得很麻烦,其实用会了之后,也不是那么麻烦了。

代码下载

Window2.zip (590.07 kb)

546路过 1评论 iPhone开发 阅读全文..

当我们想开发基于多窗体的应用程序的时候,我们就需要使用多窗体的应用程序模板去开发,当然,这个时候我们就要去自己写一些窗体的应用开发了,所以在写多窗体应用程序开发的时候,我们首先要手动的去写一个窗体,于是我们就要创建一个Window-Based应用程序。我们按照下图创建一个Window-Based应用程序,并命名叫Window。

创建完成后我们可以看到系统给我们创建的模板的东西很少,就只有一个WindowAppDelegate.h和WindowAppDelegate.m,这两个文件,由于前面我们说了iPhone是基于MVC模型开发的,所以在这里,我们的Delegate委托只是用于调用一个Controller而已,例如前面的项目中MainWindow调用了HelloWorldController一样,只是不同的是现在我们要自己写Controller。不过,在自己写之前,我们还要更改委托类的代码。我们首先添加一个Controller,我们就命名为MainWindowController。

创建好之后,我们就可以在代码中更改如下代码了,我们可以给.h和.m代码分别更改如下(加粗为更改的代码)。

#import <UIKit/UIKit.h>

@class MainWindowController;

@interface WindowAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow
*window;
    
IBOutlet MainWindowController *mainWindow;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainWindowController *mainWindow;

@end

然后编写实现的类,代码如下。

#import "WindowAppDelegate.h"
#import "MainWindowController.h"

@implementation WindowAppDelegate

@synthesize window;
@synthesize mainWindow;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
    [window addSubview:mainWindow.view];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [mainWindow release];
    [window release];
    [super dealloc];
}

@end

这样,在开始主程序的时候会通过MainWindowController打开窗体,现在,我们要连接MainWindow.xib到我们的MainWindowController。首先我们打开MainWindowController,我们可以看到一个主窗口,打开之后我们需要为主窗口增加一个View,我们可以双击下面的View Controller图标,创建一个类似灰色图形区域的View实例。

双击上面的View控制器添加,如果双击不起作用,可以关闭当前Interface Builder然后再打开,双击后可以看到如下图所示的窗口。

当我们创建好之后,可以在身份检查器中看到该View的类的定义,而且也可以看到MainWindow.xib的控制窗体中增加了一个Main Window Controller图标,我们可以点击上面的View,也可以点击图标,然后在类定义中选择我们刚才创建的类MainWindowController,如下图所示。

更改了类名称之后,就是告诉MainWindow.lib连接MainWindowController这个类,这样这个UI就知道如何去使用类了。

这里还需要指出的是,我们这里添加了一个View的实例到MainWindow,然后更改了View这个实例的类的连接,所以我们只需要在MainWindowController下面去更改任何代码,即可以实现我们想要的效果了,如添加事件等等。我们可以看到我们的控制窗口如下。

我们右键点击File’s Owner,可以看到File’s Owner是连接自WindowAppDelegate的,而新的Main Window Controller才是我们真正需要连接的类,这里可能有点难以理解,但是必须要理解这个地方。和前面的基于View的应用程序不同,主窗体是通过AppDelegate去启动的,启动之后,我们创建了View的实例并连接到了View的类(Controller)。所以Main Window Controller才是我们的Controller对象,和单独的View的窗体不同,这点我会在后面再解释。

在连接了之后,我们还需要将deletegate连接到Main Window Controller,我们只需要按住Control然后将Window App Delegate拖到Main Window Controller即可,如下操作。

在小的灰色窗口中我们选择mainWindow,也就是我们在WindowAppDelegate中写的MainWindowController的实例,可以看前面的代码段。这样我们就连接了UI,MainWindowController和AppDelegate了,是不是感觉很难理解?确实,我自己也觉得有点难理解。

连接好之后,我们运行应用程序,就会发现,打开的窗口就是我们新写的View的实例了,在开发中,我们就为我们的MainWindow写了一个MainWindowController并连接了,这样就可以使用MainWindowController去更改我们的MainWindow的UI和相应的事件了。

总结这个步骤:

  • 创建Window-based应用程序。
  • 创建MainWindowController。
  • 更改AppDelegate代码,引用MainWindowController。
  • 打开MainWindow.lib,并增加一个新View的实例。
  • 更改新View的Class。
  • 连接Delegate到新View。

通过上面几个步骤,我们就编写了主窗口。

在编写了主窗口之后,我们才能考虑如何去编写多窗体的应用程序。

示例代码

Window.zip (559.15 kb)

609路过 1评论 iPhone开发 阅读全文..

这两天开始着手写嘀咕的iPhone应用程序,一是现在的iPhone应用程序不符合我的要求(我自己使用的一个底线,ui功能等),另一方面也是更重要的一个方面就是锻炼iPhone库的熟练度,和一些开发平台方面的测试了。

在写嘀咕这个程序的时候,需要从Web Open API得到一些信息,我发我的身份给服务器,那么服务器就会验证然后返回信息给我,那么我就可以得到消息了。但是大部分的这种API都是通过username:password再base64一下就可以了,但是Object-c里没有默认的base64的库,那么,我们就需要自己去查了。

于是我查,顺带就要说一句,真的很难查,还有很多国内的博客作者极度不负责任,转载文章不说,转载一半不说,不能运行不说,用了其他的库也不说明一下,害我浪费了3个小时找这个base64的算法,自己写肯定不太可能,不是能力问题,是时间问题,最后发现Google有一个库,可以提供使用。

我这里保证现在是绝对没有问题,而且非常方便容易使用,可不是给你两个函数让你自己去琢磨怎么使用。

下载下面的base64.zip然后皆压缩放到你的项目里面。

然后我们自己写一个方法去调用即可,很简单,我自己封装了一个类去做,这样对我来说,库里的函数就比较透明了,当然也不是必须的。在我当前机器上可以使用,如果有问题请联系我。 

//.h文件,默认即可
#import <Foundation/Foundation.h>

@interface Utility : NSObject {

}

+ (NSString*)encodeBase64:(NSString*)input;

@end

上面是头文件,下面是代码文件,我这样写是方便理解,可以自己把这个方法写到任意代码里都行。

#import "Utility.h"
//使用头文件
#import "GTMBase64.h"

@implementation Utility

+ (NSString*)encodeBase64:(NSString*)input
{
    NSData
*data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
   
//转换到base64
    data = [GTMBase64 encodeData:data];
    NSString
* base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
return base64String;
}

@end

下次需要将字符串转换成base64的时候,直接使用encodeBase64即可。

base64.zip (10.41 kb)

1,326路过 5评论 iPhone开发 阅读全文..
2010年01月11日

前面我们做了一个简单的iPhone的Hello World,而且我们也可以编写一个非常简单的ui的应用程序,现在我们就要想如何去连接这些ui(也就是说添加事件了),例如我想要有一个这样的效果,上面我写了一个Hello World的文本框,现在我就想要单击一个按钮,将这个文本更改,也就是触发事件。

iPhone里面的事件是用委托形式触发的,这个我就不多说了,我们想要得到的效果如下所示。

虽然我们有界面编辑器,但是事件并不象VS里面单击某个控件那样会自动生成代码,我们需要编写一点代码去实现这个效果。首先我们还得回忆起来,iPhone是MVC的开发模式,于是我们直接在相应的Controller里写代码即刻,我们先在头文件中编写如下代码。

#import <UIKit/UIKit.h>

@interface HelloWorldViewController : UIViewController {
    //初始化一个控件
    IBOutlet UILabel *helloworldText;
}
//定义控件这个属性
@property (retain,nonatomic) UILabel *helloworldText;

//编写一个事件的代码
- (IBAction)buttonPressed:(id)sender;

@end

上面是我们写的头文件的代码,这个时候我们还需要写.m,也就是代码文件的代码,来实现我们相应的要求。代码如下。

#import "HelloWorldViewController.h"

@implementation HelloWorldViewController

//分配一些空间
@synthesize helloworldText;

- (IBAction)buttonPressed:(id)sender
{
    
//初始化一个字符串
    NSString *text = [[NSString alloc] initWithFormat:@"Clicked"];
    helloworldText.text
= text;
}

现在我们的头文件和代码文件都写完了,逻辑很简单,就是buttonPressed事件触发了之后执行相应的代码。

注意:事件的写法一般都会加一个sender,我们通过sender对象获取发送事件的对象。

在编写好之后,我们再打开界面编辑器,连接这些控件。

首先,我们按住control,拖动File’s Owner,然后拖动到文本控件上,然后放开,这个时候你会看到一个灰色的小的popup,我们选择小的popup里面需要连接的对象即可,这里我们的变量名字是helloworldText,于是我们选种helloworldText。

选中之后,我们就添加File’s Owner到ui上了,然后我们就可以添加按钮事件了,我们选择按钮,在Connections Inspect中可以看到有个很像尺子的小图标,这个图标的左边就是事件按钮了,我们选择,在需要的事件右边的小圆圈中,这个时候不需要按住control,直接点击鼠标,拖动到按钮上即可。

添加完成之后,我们就可以看到我们的事件已经添加完毕了。

这里我添加的是Touch Up Inside事件,为什么是Touch Up Inside事件呢,因为苹果为用户体验以及很多细节都做了思考,例如我们有这个按钮,当我们按下去的时候发现又不想按了(这种情况时常发生),于是我们会拖动我们的指头到外面然后放开,这个时候我们的iPhone就知道用户其实是不想按的,所以Touch Up Inside事件是不会被触发的,其他的事件同理了。我就不需要多说了。

然后我们选择Build and GO,看看我们的事件是不是添加成功了?:)

962路过 2评论 iPhone开发 阅读全文..
2010年01月3日

其实我写这些技术博客,一方面是写给新手去看,这样这些新手就不会像我这样找了半天找不到国内的资源,另外一方面也是留给自己看,本来我的博客访问量也不是很大,所以,大部分还是留给自己看。=。=

OK,如果你喜欢做一点iPhone的开发的话,可以尝试一下,iPhone的用户体验很不错,不过最近Google的手机也是很火,这个就看自己的方向了,不过程序开发都是那样,大同小异。首先,我们必须要做的就是有一个Mac系统,然后去下载一个XCode,XCode可以去这里下载

下载完成之后,同样,我们需要写一个Hello World来上上手,我们打开XCode,然后创建一个新的项目,如下图。

单击New Project,我们就能够创建一个新项目,这里我们选择iPhone的Application,并且我们先选择View-based Application,iPhone的应用程序是基于MVC的开发模式开发的,也就是Model,View和Controller,也就将传统的面向对象设计分开为模型层,视图层和控制层,更加深入的MVC的概念我就不多说了,现在我们只是开始动手做一个简单的应用程序。

我们选择ViewBased Application创建一个新程序,创建好之后我们就可以看到如下窗口。

我们可以看到右边上面的是文件区域,也就是文件管理区域了,右边的下面是代码区域,当我们选择了相应的上面的文件之后,下面的代码区域就会显示相应的代码提供编辑。感觉很废话吧,不过我们还是要说说几种文件类型。我们现在首先需要关心的是三种文件类型,分别为.h,.m,.xib。

  • .h:头文件类型。
  • .m:代码文件类型。
  • .xib:用户界面之类的文件类型。

暂时在这里我们这里无需自己编写代码,我们直接打开xib文件打开设计器直接设计iPhone应用程序即可,这里我们需要打开的是mainWindow.xib,虽然我们通常情况下不会直接编辑此界面文件

我们可以看到主窗体的界面是载自MyHelloWorldViewController,我们单击这个像超链接的就可以编辑这个Controller。

我们需要打开Tools菜单里面的Library,Attributes Inspector和Connections Inspector,这三个分别为空间的库,一个为属性窗口和联系窗口(相当于事件了)。

我们可以从最右侧的Library中拖动一个View控件到我们的窗体中,然后我们编辑相应的控件,然后就能够写一个简单的Hello World文本,如下图。

然后呢,然后我们在Xcode编辑器中选择Build And Go就能够运行我们的程序了,看上面的iPhone模拟器运行的效果,是不是还不错,不过写HelloWorld虽然不难,但是却让我们能够对iPhone应用程序有一个基本的简单的初步印象,代码是如何运行的,各个文件是如何协调的,然后就是MVC的设计模式。

马上我们最需要关心的就是如何写做一些比较复杂的事情,然后给不同的控件添加事件,这方面没有VS来的方便,不过还算比较方便,但是作为C/C++开发的人员估计一开始上手都觉得很别扭,不过还好,我们下次就会说如何添加事件了,但是首先最主要的是,看看iPhone的结构是如何开发的,当然,还要看看一些Object-C的基础了。

458路过 2评论 iPhone开发 Mac 阅读全文..
2009年10月26日

这两天除了爬香山以外,在家里无聊还研究了一下iPhone的皮肤制作,虽然我自己本身不怎么想做这个皮肤,但是无奈太多皮肤设计的都太不好了,并不是说图标不好,而是整体感觉不好,所以为了整体感觉,我就想为我iPhone里所有的程序都自己设计一下图标,这样就会好很多。这里也是为了自己记住,也方便新手去看,这里iPhone都需要越狱并且安装WinterBoard。

       

首先我们要说的是如何安装主题,进行文件传输,这里可以使用两个工具,一个就是91助手了,另一个就是WinSCP,一般主题都会放在/private/var/stash/Themes.******/目录下,后面是×××因为不同的机器编号也不一样,但是用91助手的话就会简单一点,建议一开始做皮肤的使用91助手,直接添加主题的文件夹即可。

一般主题里面包括如下这几个文件夹和文件:

  • – Bundles
  • – Icons
  • – Private
  • – UIImages
  • – UISounds
  • – Info.plist
  • – StatusBar.png
  • – Wallpaper.png
  • – Dock.png
  • – Wallpaper.html

这几个文件夹及文件的基本作用如下。

  • Info.plist:主要用来定义图标文字的颜色、大小等。
  • StatusBar.png:顶部状态条图片。
  • Wallpaper.png:背景壁纸。
  • Dock.png:DOCK的样式。
  • Wallpaper.html:这里可以调用动态壁纸等。

当然,我这里只写了一点点,要完全写出来也不是一件很现实的事情,所以这里我们就必须手动的来做一下。下面我传了我做的这个的主题包,可以自己去看,我在后面分别讲解。

GuoJing.Theme.Lite.rar (522.38 kb)

1.首先我们要做主题的背景,并保存为Wallpaper.png并放置到我们的皮肤的根目录下。

2.短信背景可以制作一个图片SMSBackground.png并放置到根目录下,我们就可以看到短信背景被改变了。(是不是很简单?)

3.如果要改短信的冒泡的图标,需要制作Balloon_1.png和Balloon_2.png这两个文件。Balloon_1.png 是发短信的样式,Balloon_2.png 是接收短信样式。我们只需要放置到/private/var/stash/Themes.******/istyle.theme/Bundles/com.apple.MobileSMS/里面即可。(如果没有文件夹就自己建立一个

           

Balloon_1.png   Balloon_2.png

4.如果要替换锁屏的背景,可以制作UILCDBackground.png放置到/private/var/stash/Themes.******/制作的主题/UIImages/里面。

5.我们还可以做屏幕滑块图片,bottombarknobgray.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.TelephonyUI/,同样,我们还可以更改屏幕滑块背景保存到这个文件夹,保存为bottombarbkgndlock.png即可。

6.如果要更改图标右上角那个小的提示的数字的背景的话,可以使用这个保存为SBBadgeBG.png放置到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard下面。

7.如果我们要改iPhone下面四个按钮的背景的颜色,也就是Dock的背景的话,我们可以将SBDockBG.png保存到/private/var/stash/Themes.******/制作的主题/Bundles/com.apple.springboard/

8.如果我们要更改顶部的状态栏的话,我们需要做一个StatusBar.png替换到主题根目录下。

9.如果我们要更改如短信,提醒的弹出窗口的UI界面的话,我们就需要制作UIPopupAlertSheetBackground.png保存到主题下面的UIImages里面即可。

上图是我做的一个弹出界面,保存即可更改提醒方式

 10.下面可以看一下提醒的效果图,做完效果图,我们就要做icon了,做icon我们最好把语言设置为英语,因为只有设置为英语了我们才能够按照相应的名字去做icon。

       

左边是提醒的一个演示,右边就是我们要做的icon了,我们做好的了icon,并命名为相应的同名的png保存在Icons目录下即可,记得,如果图标是Mail,就要保存为Main.png,如果是人人的话,保存为人人.png即可。

看完整个iPhone皮肤制作,是不是觉得不是很难,对,只要替换一下相应的图标即可,不过这个是初级的制作了,我们还可以更改充电的图标,蓝牙的图标,无线的图标,运营商的图标,很多很多了,建议大家自己下几个做的很完美的主题去看,这样就能够学到更多的东西,如果以后我会做复杂的主题的话,我可能还会上来写如何制作复杂的主题。

PS:其中一部分图标是来自Deep主题(国外的免费主题)的,为了达到整体效果统一,我自己做了一些相同风格的图标,已经一并打包上传了,可以自己下下来修改,PSD源文件可以从这里下载。

iphoneicon.psd (188.99 kb)