在前面我们建立了一个简单的Hello World!程序。其实我们并不知道这个程序是怎么运行起来的,各组件是怎么工作的。事实在我们在iPad程序开发过程中,我们需要学习大量的知识。一穷二白最艰难,但是也是最有效果和成就感的,当然也很枯燥。这节开始我们来一起了解创建iPad程序用户界面(UI)和怎样将我们的代码和图形工具进行链接;
输出和事件响应
首先我们需要理解iPad程序的outlets(输出或者说引用)和Actions(事件响应或者动作),在这一点上,Objective其实和Java和C#很想像,概念是一样的就是实现的手法有所不同而已。好让我们用实例来讲解一下:
1.打开我们的Xcode,创建一个视图应用程序(View-based Application )取个名字叫OutletsAndActions
2.双击OutletsAndActionsViewController.xib文件,打开Interface Builder。在View窗口中用Label,TextField,和Button插件分别创建一个标签、文字输入框和一个按钮。将标签名称改为:Enter your Name,按钮名称弄成“OK”。如图:
3.在Xcode中,我们在OutletsAndActionsViewController.h文件添加代码:
#import <UIKit/UIKit.h>
@interface OutletsAndActionsViewController : UIViewController {
//---declaring the outlet---
IBOutlet UITextField *txtName; }
//---expose the outlet as a property---
@property (nonatomic, retain) UITextField *txtName;
//---declaring the action---
-(IBAction) btnClicked: (id) sender;
@end
4.在OutletsAndActionsViewController.m文件中添加下面代码:
#import “OutletsAndActionsViewController.h”
@implementation OutletsAndActionsViewController
//---synthesize the property---
@synthesize txtName;
//---displays an alert view when the button is clicked---
-(IBAction) btnClicked:(id) sender {
NSString *str = [[NSString alloc]initWithFormat:@“Hello, %@“, txtName.text];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@“Hello!”
message:str delegate:self
cancelButtonTitle:@“Done”
otherButtonTitles:nil];
[alert show];
[str release];
[alert release];
}
找到dealloc段,添加:
- (void)dealloc {
//---release the outlet---
[txtName release];
[super dealloc];
}
5.剩下的操作很easy.按住Ctrl将File's Owner拖向文字输入窗口(TextField).在弹出的小窗口选
折txtName的输出.
6.按住Ctrl将Ok按钮拖动到File's Owner.选择btnClicked:的事件响应(action).
7.右键单机Ok按钮,我们可以看到事件列表
注意在这些事件中有一个事件-Touch Up Inside是被链接好了的,因为我们将按钮拖动到File's Owener
的时候系统会自动连接好.如果我们想对另外的事件做出响应,那么我们可以点击事件右边的圆圈,拖动它
到File's Owner中就可以了.
8.好了,C+S(Ctrl+S,




^_^老九偷懒了),C+R.运行看看,在文字框中输入你的名字,然后按OK,
OH!Yeah!老九看到你叫什么名字了,呵呵
下面我们来讲解一下这个程序是怎么运行的:
在iPad中,我们用actions和outlets去链接我们可视化界面的各种代码.actions类似面对像语言中的
方法,outlets相当于对象的引用.当IBAction关键字被激活(被actions)的时候,outlets自动引用IBOutlet
关键字.
#import <UIKit/UIKit.h>
@interface OutletsAndActionsViewController :UIViewController {
//---declaring the outlet---
IBOutlet UITextField *txtName; }
//---expose the outlet as a property---
@property (nonatomic, retain) UITextView *txtName;
//---declaring the action---
-(IBAction) btnClicked: (id) sender;
@end
IBOutlet关键字:IBOutlet就是一个显式的引用访问标记,一般用于变量前面,以至于Interface Builder
能同步显示所引用的内容和与Xcode语言中的输出进行连接.@property是一个txtName的属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。默认的行为是原子性访问atomic.注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。(我在网上查的资料,我再问问正确的理解)
注意:IBOutlet标签经常被添加到@property标签中,这在水果公司的文档中比较常见,我们记住就ok了!
@property (nonatomic, retain) IBOutlet UITextField *txtName;
IBAction关键字:IBAction就是一个方法的显式引用标记,是被用于事件响应的方法的标记.比如当我们用鼠标点击按钮,这个action就是一个出发窗口事件发生的方法.另外一边,作为outlets所引用的内容也就跟随着你的代码所要实现的目的展现出来.
额,在网上有人这样说:假设有两个黑盒子,盒子A里放着代码,盒子B里放着盒子A要用到的ui组件,要想让A里的代码访问到B里的组件,比如想要修改label的文字,那些就要从A处打个洞连到B处,这时就用IBOutlet,B中的组件如一个按钮被用户点击了,要给A发个通知,那么也要事先在A处安个接受装置,这时就用IBAcion.这个东西就只可意会了!
一旦你的actions和outlets被添加到了窗口控制的.h头文件中,我们这时就需要在Interface Builder中连接他们.
当我们按住Ctrl拉动File's Owner去链接TextField文字输入框并且选择txtName标签的时候,实际上我们就在我们用TextField文字输入框所创建的(txtName)上与outlet建立了一个连接.一把而言.连接到outlets我们所要引用的内容,就需要按住Ctrl将File's Owner拖动到视窗中所需要的窗口就可以了.
反过来:如果我们对Actions进行定义,我们就需要按住Ctrl拖动action的处罚点(如按钮)到File's Owner就可以了.
在.m执行文件中,@synthesize关键字是一段简化代码,表示系统自动生成getter和setter两个方法,不需要我们手动编写.(关于@property和@synthesize,这个文章写的很详细,建议新手们拜读,你会有更深入的认识http://www.cocoachina.com/bbs/read.php?tid-7322.html)
注意:忘记添加@synthesize关键字是初学iPad开发的开发者最容易犯的错误,记住这一点,不然你在运行程序的时候就会出现Runtime error了.空了查查Xcode帮助文档吧!
#import “OutletsAndActionsViewController.h”
@implementation OutletsAndActionsViewController
//---synthesize the property---
@synthesize txtName;
//---displays an alert view when the button is clicked---
-(IBAction) btnClicked:(id) sender {
NSString *str = [[NSString alloc]initWithFormat:@“Hello, %@“, txtName.text];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@“Hello!”
message:str delegate:self
cancelButtonTitle:@“Done”
otherButtonTitles:nil];
[alert show];
[str release];
[alert release];
}
这段代码理解起来就容易了:一个包含用户名字消息的alert窗口,在btnClicked被action的时候显示出来.
注意这里的id表示任意类型的参数.sender将会允许程序自动寻找谁是这个action的调用者.这个在多个
窗口同时链接到一个action的时候十分有用.在很多例子中,我们经常需要知道哪一个窗口是这个方法的
调用者,sender的参数对应调用哪一个窗口.
慢慢理解,我也是看了n遍资料,查了n多例子程序才明白.今天到这里把,太晚了,明天,哦不,是今天早上我还
要出差呢.呵呵!
窗口内容属性调整
在前面章节我们看到了诸如方向改变、大小和位置改变所带来的变化。光是这样的定义是不能满足你的实际应用程序的需求的,所以我们应该让我们设计在主页面内的内容变化更加智能的适应窗口的变化。
我们来到设计主页面(Interface Builder)选择View窗口中的Label标签,在菜单栏选择Tools→Size Inspector。可以看到出现了Label Size窗口,我们选中的是Hello World的Label标签,我们可以看到在Autosizing窗口中间有些小箭头,点击这里面的那些虚线,变成实线了就表明到那个边恒定不改变。这里大家实践一下就明白了。so easy,妈妈再也不用担心我学习ipad了。
这里我们选择外框顶部和内框内的实线,让Label标签恒定大小,自动适配在主页面中的位置保持在中心
以此类推,讲文字输入标签和按钮标签都做响应的调整
调整完后,我们可以保存再看看调整的效果,在你翻动模拟器屏幕的时候,就可以看到变化了。
你也可以通过在View窗口右上角的箭头进行方向改变,看看效果
我们开始对按钮标签弄一些代码,看看效果,最简单的代码就是alert响应了吧。我们试试弹出alert窗口代码。
首先我们打开HelloWorldViewController.xib窗口,在里面我们能看到有3个组建:File's Owner,first Responder,和View。我们按住Ctrl再点击我们的Click me按钮,拉动它到File's Owner组建,这个时候会弹出一个选项包含btnClicked:action显示,选择action。这时但我们点击Click Me按钮时这个动作就被激活了。
打开HelloWorldViewController.h文件,在这个位置添加如下代码:
#import <UIKit/UIKit.h>
@interface HelloWorldViewController : UIViewController {
}
-(IBAction) btnClicked:(id) sender;
@end
再打开HelloWorldViewController.m文件,在这个位置添加如下代码:
#import “HelloWorldViewController.h”
@implementation HelloWorldViewController
-(IBAction) btnClicked:(id) sender {
//---display an alert view---
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@“HelloWorld!” message:@“iPad, here I come!” delegate:self cancelButtonTitle:@“OK” otherButtonTitles:nil];
[alert show];
[alert release];
}
好,保存,run,我们就可以看到当我们点击Click Me按钮时会弹出对话框“iPad,here I come!”
最后我们来更改一下我们的应用程序图标
我们现在的程序图标还是一个白色的小图片,怎么样更改呢?首先我们要知道iPad的图标像素大小,有两种:72*72和48*48pixels大一点的用于主页面,小一点的用户系统菜单,如:
这是程序图标,我们看system图标,这是72*72的
这是程序内部的图标,48*48的
把一个你改好的大小的图标拉到Interface Builder窗口左边的Resources文件夹内,它会问你是否做图像拷贝,yes。ADD一个图标。
选择这个图标文件,修改它的名称值为:app-icon.png,这个名字将会使这个图标被默认为是应用程序图标。
good,到这里我们的Hellow World程序就完成了!是不是很简单?
iPhone SDK 4是一个完全面对像设计的开发工具(IDE),我们要做的就是打好基础,熟悉语法,好开始
前言:了解构建iPad程序主干:
我们构建的iPad应用程序都包含一些关键的组建:
mian()函数(始终使用)。每一个基于C的程序都需要用到main()函数。对于iPhone和iPad程序而言,此函数主要用于内存管理及应用程序事件的循环。
applicationDidFinishLaunching:方法(经常使用)。这个方法是程序中出发的第一个方法,在其中创建基本窗口、设定内容并指定他作为应用程序的关键响应者。
applicationWillTerminate:方法(经常使用)。这个方法支持在将控制交会SpringBoard之前,处理任何状态最终化。用来保存默认值、更新数据以及关闭文件。
loadView方法(始终使用)。强制的这个方法讲设置屏幕并布局任何子视图。
shouldAutorotateToInterfaceOrientation:方法(经常使用)。自动屏幕适配,就是横竖都可以看!
1.开始我们的第一个Hello World!程序
创建一个新的iPad 项目(上一节我们已经知道怎么建立新项目了,讲项目名称保存为Hello World)
Xcode将会自动生成一个项目,你可以看到很多文件和文件夹,对,这就是你的项目
这个图会看吧,左边文件夹列表,右边每个文件夹所包含的文件,双击可Edit!呵呵!
习惯使用Interface Builder
这个项目还没有界面。我们来搞定它,按Command-R(windows+R)或者在菜单栏里面选择Run→Run,你会看到一个运行成功的模拟器(白板一个)。
呵呵,就算我们什么也不写,程序的框架已经行程可以在模拟器中运行和显示,你可以看到模拟器中的界面有了我们的新程序Hello World。如果这样的白板程序也能放在Appstore里面卖钱就好了,取个名字叫“白炽灯程序”晚上可以当台灯或者荧光灯。
不过这样没用的程序还是不要了,我们来做点什么让这个程序变的丰满些吧。
在我们项目的文件列表中我们可以注意到两个.xib文件,——MainWindow.xib和HelloWorldViewController.xib这两个文件,xib文件是定义一个应用的XMl文件基础。我们能够很容易的通过InterfaceBuilder编辑它。在这里我们要做的工作就是拖来拖去就搞定了。
双击这个HelloWorldViewController.xib文件,将显示出一个运行效果和一些可视化图层窗口。里面有很多傻瓜插件,直接拉过去就可以组成很PP的页面,这里先不忙着做,我们还是完成了我们的Hello World都。
在基础模式(Landscape mode)中,显示view窗口(点击右上角的箭头可以改变View窗口的方向,这个就是我们把iPad横放竖放一个道理),选择Library窗口,(可将列表模式改为图标平铺模式)往下找到Label对象,拉动Label到View窗口。
我们看到了View窗口中有了一个Label标签被添加进去了,我们选择菜单栏的Tools→Attributes Inspector。输入Hello World!。
在用快捷键Command-T打开文字编辑窗口,对文字属性进行微调。
再回到Library窗口,添加一个Text Field(文字输入按钮)和一个Round Rect Button(事件反馈按钮)按钮上输入文字Click Me!小贱一下。
好,我们保存。Command-S,现在回到Xcode窗口,运行这个程序Commond-R。我们就看到了我们所修改了界面的Hello World iPad程序。
用鼠标点击文字输入栏,看看触摸键盘是否弹出
再点击Home button(你不要给我说你不晓得什么叫Home button哈,就是Ipad上的唯一按钮那个方块块)你可以看到我们的程序还在模拟iPad的主页面上。点击一下程序图标,我们又回到了程序里面,简单。
注意:在任何时候iPad都只能运行一个程序(除了一些内建的苹果应用,比如我们可以一边开ipod听歌一边看ibook)。因此在我们点击Home botton的时候我们的程序就完全终止,点击再开始。
如果这样就写完我们的Hello World程序十分太简单了?那我们来升级一下
改变我们屏幕的方向
我们的iPad模拟器也是可以改变方向的,如果要改变方向我们可以按Commond-→或者Commond-←进行方向调整。刚才是横的,现在我们改变成竖的
当我们改变方向的时候,我们的程序会自动保持垂直方向。这段代码可实现这项功能:
在Xcode里面找到HellowWorldViewController.m文件,在窗口下方的代码行里找到
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)
interfaceOrientation {
return YES;
}
我们看到要求返回值是YES,这就表示我们的程序会自动根据方向改变保持垂直方向。
我们这样修改这段代码:
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)
interfaceOrientation {
//return YES;
return (interfaceOrientation==UIInterfaceOrientationPortrait ||
interfaceOrientation==UIInterfaceOrientationLandscapeLeft);
}
这个代码将在iPad向左转动90°后没有变化。在这段代码中组后部分。。Left可以改为Right,这样向右转动90°的效果一样。呵呵!
这个应用应该是iPad或者iPhone也好,最重要的一个应用了。基本上所有的程序都会涉及到,如果弄的不好,你的程序可不好看哦!易用性不强哦!卖的就不好哦!
下一讲:界面内容的定位,以及事件的反馈

我也刚开始从Java往Objective-C转,大家一起来学习吧!
自己根据一些电子书编写的Iphone SDK to Ipad 教程。
转载请说明出处,谢谢!
Charpter1
1.了解iphoneSDK
Obta ining the iPhone SDK
如果要成为Ipad开发者,你需要到Iphone Developer网站去注册,并且成为会员。http://developer.apple.com/iphone/program/start/register/.
注册是免费的,但是如果你要将你写好的ipad程序放到Appstore卖钱,那就要注册成为正式开发元,会员费99刀!
NOTE:Ipad用的是和iphone和ipod一样的系统。
下载最新的Iphone SDK 目前版本4
在你安装好你的SDK前,你最好升级你的系统,如果是VM安装的MAC系统,那考验你主机的时候到了!最好i5以上,4G内存!
新版本的iPhoneSDK包含了一整套开发Ipad、Iphone、IPod的工具,帮助你开发你的应用程序:
➤➤ Xcode — Integrated development environment (IDE) 完整的开发环境能让你充分管理、编辑、编译你的项目.
➤➤ Dashcode — 老九的理解即使面板式开发,让用户自我创建 Widget。
➤➤ iPhone Simulator — Iphone、Ipad模拟器,可以快捷的子模拟器上Run你写好的程序
➤➤ Interface Builder — 可视化编程工具,和Microsoft的VisualStudio系列类似
➤➤ Instruments — 帮助你的程序最优化的分析工具,包括内存监控
Xcode
启动Xcode, (/Developer/Applications folder)最好是在Dock上做一个链接,方便一点。
Xcode的欢迎界面,看到这个很高兴!
创建一个你自己的Ipad程序,点击Create a new Xcode project,进入程序类型选择界面,你可以看到在窗口的左边有你所开发的程序类型的选择,有Iphone os,有Mac osX,当然我们选择Iphone os。再选择View-based Application。
好到这里我们暂时等等,先讲下面的
2.iphone(Ipad)模拟器
模拟器是个十分有用、而且高效的工具,打开模拟器在/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications 文件夹里面
这是个Simulator模拟器,而不是emulator仿真器。它能做一切真实iphone或者ipad能做的事情,而且有很多版本可以选择,可以选择os版本,从3.0到3.4,硬件选择可以选择iphone或者ipad。Simulator可以在MAC环境下很好的模拟真实的iphone或者ipad终端,从而快捷的进行程序的显示和修改。
将程序从模拟器里删除和在显示用的使用是一样的,用鼠标按住你所安装的软件,等待图片抖动后出现X标记,点击X标记就可以删除,删除后程序所对应的文件夹也一并删除
3.IphoneSDK的框架
Interface Builder
可视化编程可以让我们在用户界面中进行ipad程序编程,能拖动窗口对程序界面进行设计,在代码和页面之间建立链接,能适时反应出代码对程序的影响和作用。
这就是标准的interface Builder界面
Mac os X与 iphone os区别
底层都为Core OS,它是程序的基础,它负责管理内存、文件系统、其它系统任务,,直接和硬件进行通信,Core OS包括:
➤➤ OS X Kernel
➤➤ Mach 3.0
➤➤ BSD
➤➤ Sockets
➤➤ Security
➤➤ Power Management
➤➤ Keychain
➤➤ Certificates
➤➤ File System
➤➤ Bonjour
Core Services layer为Core OS layer提供一个对象服务,它提供对Iphone OS服务的基本的通信,主要由以下部分组成:
➤➤ Collections
➤➤ Address Book
➤➤ Networking
➤➤ File Access
➤➤ SQLite
➤➤ Core Location
➤➤ Net Services
➤➤ Threading
➤➤ Preferences
➤➤ URL Utilities
The Media layer主要为你的Ipad应用提供多媒体应用服务,它包括:
➤➤ Core Audio
➤➤ OpenGL
➤➤ Audio Mixing
➤➤ Audio Recording
➤➤ Video Playback
➤➤ JPG, PNG, TIFF
➤➤ Quartz
➤➤ Core Animation
➤➤ OpenGL ES
The Cocoa Touch layer为Ipad程序提供多种对象函数库应用,如:
➤➤ Multi-Touch events
➤➤ Multi-Touch controls
➤➤ Accelerometer
➤➤ View Hierarchy
➤➤ Localization
➤➤ Alerts
➤➤ Web Views
➤➤ People Picker
➤➤ Image Picker
➤➤ Controllers
Iphone SDK由多种Frameworks(框架)组成:framework 是一种特殊功能的软件函数库
Framework Name Description
AddressBook.framework Provides access to the centralized database for storing a user’s contacts.
AVFoundation.framework Provides low-level C APIs for audio recording and playback, as well as for managing the audio hardware.
AudioToolbox.framework Provides low-level C APIs for audio recording and playback, as well as managing the audio hardware.
AudioUnit.framework Provides the interface for iPhone OS-supplied audio processing plug-ins in your application.
AVFoundation.framework Provides low-level C APIs for audio recording and playback, as well as for managing the audio hardware.
CFNetwork.framework Provides access to network services and configurations, such as HTTP, FTP, and Bonjour services.
CoreAudio.framework Declares data types and constants used by other Core Audio interfaces.
CoreData.framework Provides a generalized solution for object graph management in your application.
CoreFoundation.framework Provides abstraction for common data types, Unicode strings,XML, URL resource, and so on.
CoreGraphics.framework Provides C-based APIs for 2D rendering; based on the Quartz drawing engine.
CoreLocation.framework Provides location-based information using a combination of GPS,cell ID, and Wi-Fi networks.
ExternalAccessory.framework Provides a way to communicate with accessories.
Foundation.framework Provides the foundation classes for Objective C, such as NSObject, basic data types, operating system services, and so on.
GameKit.framework Provides networking capabilities to games; commonly used for peer-to-peer connectivity and in-game voice features.
IOKit.framework Provides capabilities for driver development.
MapKit.framework Provides an embedded map interface for your application.
MediaPlayer.framework Provides facilities for playing movies and audio files.
MessageUI.framework Provides a view-controller–based interface for composing e‑mail
messages.
MobileCoreServices.framework Provides access to standard types and constants.
OpenAL.framework Provides an implementation of the OpenAL specification.
OpenGLES.framework Provides a compact and efficient subset of the OpenGL API for 2D and 3D drawing.
QuartzCore.framework Provides ability to configure animations and effects and then render those effects in hardware.
Security.framework Provides the ability to secure your data and control access to software.
StoreKit.framework Provides in-app purchase support for applications.
SystemConfiguration.framework Provides the ability to determine network availability and state on device.
UIKit.framework Provides the fundamental objects for managing an application’s UI.
4.屏幕分辨率的说明
Ipad屏幕为1024*768,程序显示区域为1004*768,横向以此计算。
5.单线程窗口说明
如果你有一个新的移动应用程序,必须限制其在基本版面全屏幕显示,Ipad程序也不例外。
也不允许有后台程序,因为Iphone OS为单线程系统,这样可节约更多的内存、更多的电力。水果公司就这样定义它的程序,我们不遵守没有办法,除非越狱!
好了,本小节介绍了Iphone SDK的基础,下一节开始,我们来设计我们的第一个应用程序,Hollow World!

我是一个超级苹果迷+老乔的fans和Google的簇拥,一切新奇的事物我都好奇,摄影、运动、旅游、读书、电影、游戏都是我的爱好,荒淫大家给我留言,发邮件,请我吃饭、带我旅游(也不要忘记了我的领导同志!)……
最近留言