iOS开发:硬件访问、习题解答与Xcode使用指南
1. 硬件访问相关知识
1.1 硬件操作概述
可以对设备的多种硬件进行操作,如加速度计、Shake API以及使用Core Location的基于位置的服务。将这些知识结合起来,能够创建出非常有吸引力的应用程序。
1.2 访问加速度计
要访问加速度计,需要确保视图控制器遵循
UIAccelerometerDelegate
协议,并创建
UIAccelerometer
类的实例。为了监听加速度的变化,需要实现
accelerometer:didAccelerate:
方法。
1.3 检测晃动
可以使用加速度计数据或iPhone OS 3.0中的新Shake API来检测晃动。对于Shake API,需要处理以下事件:
motionBegan:
、
motionEnded:
和
motionCancelled:
。
1.4 获取位置数据
获取位置数据的步骤如下:
1. 向项目中添加
CoreLocation
框架。
2. 确保视图控制器遵循
CLLocationManagerDelegate
协议,并创建
CLLocationManager
类的实例。
3. 为了监听位置的变化,实现
locationManager:didUpdateToLocation: fromLocation:
方法。
1.5 指定位置数据的精度
可以使用以下常量来指定位置数据的精度:
| 常量 | 说明 |
| — | — |
|
kCLLocationAccuracyBest
| 最佳精度 |
|
kCLLocationAccuracyNearestTenMeters
| 最接近十米的精度 |
|
kCLLocationAccuracyHundredMeters
| 百米精度 |
|
kCLLocationAccuracyKilometer
| 千米精度 |
|
kCLLocationAccuracyThreeKilometers
| 三千米精度 |
1.6 显示地图
显示地图的步骤如下:
1. 向项目中添加
MapKit
框架。
2. 创建
MKMapView
类的实例,并使用各种属性来指定位置。
2. 习题解答
2.1 各章习题答案汇总
以下是各章习题的答案:
第2章
- 问题1 :应设计的最小图像尺寸为57 × 57像素。设计更大的图像也是可以的,因为iPhone会自动为你调整大小。一般来说,尽量设计更大的图像,以便为苹果可能推出的新设备做好准备。
-
问题2
:应实现
shouldAutorotateToInterfaceOrientation:方法,并编写适当的语句来支持所需的方向。若要支持所有方向,只需在此方法中返回YES,代码如下:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;
}
第3章
- 问题1 :
-
在
.h文件中:
//---declare an outlet---
IBOutlet UITextField *nameTextField;
//...
//...
//---expose the outlet as a property---
@property (nonatomic, retain) UITextField *nameTextField;
-
在
.m文件中:
@implementation BasicUIViewController
//---generate the getters and setters for the property---
@synthesize nameTextField;
- 问题2 :
-
在
.h文件中:
- (IBAction)btnClicked:(id)sender;
-
在
.m文件中:
@implementation BasicUIViewController
//...
//...
- (IBAction)btnClicked:(id)sender {
//---your code for the action here---
}
第4章
-
问题1
:要将视图连接到其视图控制器,在其
.xib文件中执行以下操作:
1. 在File’s Owner项中,将类指定为视图控制器的名称。
2. 将File’s Owner项连接到视图。 - 问题2 :当向用户显示消息时,使用警报视图。如果有多个选项供用户选择,应使用操作表。
- 问题3 :
- (void)loadView {
//---create a UIView object---
UIView *view =
[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
view.backgroundColor = [UIColor lightGrayColor];
//---create a Button view---
frame = CGRectMake(10, 70, 300, 50);
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = frame;
[button setTitle:@"Click Me, Please!" forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
button.tag = 2000;
[button addTarget:self action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchUpInside];
[view addSubview:button];
self.view = view;
}
第5章
-
问题1
:首先处理Did End on Exit事件(或在视图控制器中实现
textFieldShouldReturn:方法),然后调用UITextField对象的resignFirstResponder方法来释放其第一响应者状态。 -
问题2
:注册两个通知:
UIKeyboardWillShowNotification和UIKeyboardWillHideNotification。 - 问题3 :
//---gets the size of the keyboard---
NSDictionary *userInfo = [notification userInfo];
NSValue *keyboardValue = [userInfo objectForKey:UIKeyboardBoundsUserInfoKey];
[keyboardValue getValue: & keyboardBounds];
第6章
- 问题1 :
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-
问题2
:
frame属性定义了视图相对于其父视图(包含它的视图)所占据的矩形。使用frame属性可以设置视图的位置和大小。除了使用frame属性,还可以使用center属性,它设置视图的中心,同样是相对于其父视图。通常在执行一些动画并只想改变视图的位置时使用center属性。
第7章
- 问题1 :
mySecondViewController = [[MySecondViewController alloc]
initWithNibName:nil
bundle:nil];
- 问题2 :
- (void)viewDidLoad {
//---create a CGRect for the positioning---
CGRect frame = CGRectMake(10, 10, 300, 50);
//---create a Label view---
label = [[UILabel alloc] initWithFrame:frame];
label.textAlignment = UITextAlignmentCenter;
label.font = [UIFont fontWithName:@"Verdana" size:20];
label.text = @"This is a label";
//---create a Button view---
frame = CGRectMake(10, 250, 300, 50);
button = [[UIButton buttonWithType:UIButtonTypeRoundedRect]
initWithFrame:frame];
[button setTitle:@"OK" forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
[self.view addSubview:label];
[self.view addSubview:button];
[super viewDidLoad];
}
- 问题3 :
//---add the action handler and set current class as target---
[button addTarget:self
action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchUpInside];
//...
//...
//...
-(IBAction) buttonClicked: (id) sender{
//---do something here---
}
第8章
-
问题1
:
1. 使用Xcode创建一个新的Tab Bar Application项目,并将其命名为TabBarAndNav。
2. 双击MainWindow.xib在Interface Builder中进行编辑。
3. 选择Tab Bar Controller项并查看其Attributes Inspector窗口,将第二个视图控制器设置为Navigation Controller。
4. 双击Tab Bar Controller项,然后点击位于视图底部的第二个Tab Bar Item视图,此时应在视图顶部看到一个导航栏。
5. 回到Xcode,右键点击Classes并添加一个新的UITableViewController子类项,将其命名为MoviesListViewController.m。
6. 右键点击Resources组,添加一个新的View.xib文件,并将其命名为MoviesListView.xib。
7. 双击MoviesListView.xib文件,并将其类名设置为MoviesListViewController。
8. 将Table View视图从库中拖放到MoviesListView.xib窗口中,并从同一窗口中移除View项。
9. 按住Control键并拖动File’s Owner项到Table View,然后选择view。
10. 按住Control键并拖动Table View到File’s Owner项,然后选择datasource。
11. 按住Control键并拖动Table View到File’s Owner项,然后选择delegate。
12. 通过右键点击Table View来验证其连接。
13. 回到MainWindow.xib窗口,展开Tab Bar Controller项并选择其第二个视图控制器,将其类名设置为MoviesListViewController。
14. 在Xcode中双击SecondView.xib文件在Interface Builder中进行编辑,选择File’s Owner项,并在Identity Inspector窗口中将其类更改为MovieListViewController。
15. 在Interface Builder中保存项目。
16. 回到Xcode,在MoviesListViewController.m文件中插入以下代码:
#import "MoviesListViewController.h"
@implementation MoviesListViewController
NSMutableArray *listOfMovies;
- (void)viewDidLoad {
//---initialize the array---
listOfMovies = [[NSMutableArray alloc] init];
//---add items---
[listOfMovies addObject:@"Training Day"];
[listOfMovies addObject:@"Remember the Titans"];
[listOfMovies addObject:@"John Q."];
[listOfMovies addObject:@"The Bone Collector"];
[listOfMovies addObject:@"Ricochet"];
[listOfMovies addObject:@"The Siege"];
[listOfMovies addObject:@"Malcolm X"];
[listOfMovies addObject:@"Antwone Fisher"];
[listOfMovies addObject:@"Courage Under Fire"];
[listOfMovies addObject:@"He Got Game"];
[listOfMovies addObject:@"The Pelican Brief"];
[listOfMovies addObject:@"Glory"];
[listOfMovies addObject:@"The Preacher's Wife"];
//---set the title---
self.navigationItem.title = @"Movies";
[super viewDidLoad];
}
- (void)dealloc {
[listOfMovies release];
[super dealloc];
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [listOfMovies count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifi er = @"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifi er:CellIdentifi er];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:
UITableViewCellStyleDefault
reuseIdentifi er:CellIdentifi er]
autorelease];
}
NSString *cellValue = [listOfMovies objectAtIndex:indexPath.row];
cell.labelText. text = cellValue;
return cell;
}
- 按下Command - R在iPhone Simulator上测试应用程序。点击第二个Tab Bar项应显示一个电影列表。
-
如果想在单独的视图中显示所选的电影,只需添加另一个
.xib文件和视图控制器,具体步骤可参考相关章节。
第9章
- 问题1 :可以通过在Interface Builder中选择Info按钮并查看其Attributes Inspector窗口中的属性来关闭高亮效果。取消选择名为“Show Touch On Highlight”的选项。
-
问题2
:假设要从
FlipsideViewController向MainViewController传递一个字符串,以下代码展示了如何使用属性从一个视图向另一个视图传递数据: -
FLIPSIDEVIEWCONTROLLER.H:
#import "AddCountryViewController.h";
@protocol FlipsideViewControllerDelegate;
@interface FlipsideViewController : UIViewController
<AddCountryViewControllerDelegate> {
id <FlipsideViewControllerDelegate> delegate;
//---internal member---
NSString *str;
}
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
//---expose the member as a property---
@property (nonatomic, retain) NSString *str;
- (IBAction)done;
- (IBAction)add;
@end
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
-
FLIPSIDEVIEWCONTROLLER.M:
#import "FlipsideViewController.h"
@implementation FlipsideViewController
@synthesize delegate;
//---generates the getter and setter for the property---
@synthesize str;
- (IBAction)done {
//---set a value to the property---
self.str = @"Some text";
[self.delegate flipsideViewControllerDidFinish:self];
}
-
MAINVIEWCONTROLLER.M:
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller {
//---prints out the string obtained in the Debugger Console window---
NSLog(controller.str);
[self dismissModalViewControllerAnimated:YES];
}
第10章
-
问题1
:两个协议是
UITableViewDataSource和UITableViewDelegate。UITableViewDataSource协议包含可以用各种项填充表视图的事件,UITableViewDelegate协议包含可以处理表视图中行选择的事件。 -
问题2
:要向表视图添加索引列表,需要实现
sectionIndexTitlesForTableView:方法。 - 问题3 :三个披露和勾选图像如下:
-
UITableViewCellAccessoryDetailDisclosureButton -
UITableViewCellAccessoryCheckmark -
UITableViewCellAccessoryDisclosureIndicator
UITableViewCellAccessoryDetailDisclosureButton图像处理用户的点击事件,事件名称为tableView:accessoryButtonTappedForRowWithIndexPath:。
第11章
-
问题1
:检索偏好设置值时,使用
objectForKey:方法;保存偏好设置值时,使用setObject:forKey:方法。 -
问题2
:可以从设备或模拟器中移除应用程序,或者移除模拟器中应用程序文件夹中以
application_name.plist结尾的文件。 - 问题3 :Add Child按钮由三条水平线表示,它会向当前选定的项添加一个子项;Add Sibling按钮由加号(+)表示,它会在与当前选定项相同的级别添加一个项。
第12章
-
问题1
:
sqlite3_exec()函数实际上是sqlite3_prepare()、sqlite3_step()和sqlite3_finalize()三个函数的包装器。对于非查询SQL语句(如创建表、插入行等),最好使用sqlite3_exec()函数。 -
问题2
:要从
NSString对象获取C风格的字符串,使用NSString类的UTF8String方法。 - 问题3 :
NSString *qsql = @"SELECT * FROM CONTACTS";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, & statement, nil) ==
SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW)
{
char *field1 = (char *) sqlite3_column_text(statement, 0);
NSString *field1Str = [[NSString alloc] initWithUTF8String: field1];
char *field2 = (char *) sqlite3_column_text(statement, 1);
NSString *field2Str = [[NSString alloc] initWithUTF8String: field2];
NSString *str = [[NSString alloc] initWithFormat:@"%@ - %@",
field1Str, field2Str];
NSLog(str);
[field1Str release];
[field2Str release];
[str release];
}
//---deletes the compiled statement from memory---
sqlite3_finalize(statement);
}
第13章
-
问题1
:三个文件夹是
Documents、Library和tmp。Documents文件夹可由开发者用于存储与应用程序相关的数据;Library存储应用程序特定的设置,如NSUserDefaults类使用的设置;tmp文件夹可用于存储不会由iTunes备份的临时数据。 -
问题2
:
NSDictionary类创建一个字典对象,其项是不可变的,即填充后不能再向其中添加项;NSMutableDictionary类创建一个可变字典对象,允许在加载后向其中添加项。 - 问题3 :
-
真实设备上
Documents目录的位置:/private/var/mobile/Applications/<application_id>/Documents/ -
真实设备上
tmp目录的位置:/private/var/mobile/Applications/<application_id>/tmp/
第14章
- 问题1 :四个事件如下:
-
touchesBegan:withEvent: -
touchesEnded:withEvent: -
touchesMoved:withEvent: -
touchesCancelled:withEvent: - 问题2 :多点敲击是指在短时间内连续点击同一点,类似于Mac OS X中的双击;多点触摸是指在屏幕上同时触摸多个接触点。
- 问题3 :按下Option键可以在iPhone Simulator上模拟多点触摸。
第15章
- 问题1 :三种仿射变换是平移、旋转和缩放。
-
问题2
:暂停
NSTimer对象的唯一方法是调用其invalidate方法。要使其继续运行,必须创建一个新的NSTimer对象。 -
问题3
:
UIView类的beginAnimations和commitAnimations方法允许将导致视觉变化的代码块包含在内,从而使视觉外观的变化具有动画效果,而不会突然改变。
第16章
- 问题1 :
-
调用Safari:
@"http://www.apple.com" -
调用Mail:
@"mailto:?to=weimenglee@gmail.com & subject=Hello & body=Content of email" -
调用SMS:
@"sms:96924065" -
调用Phone:
@"tel:1234567890" -
问题2
:类名是
UIImagePickerController。 -
问题3
:类名是
ABPeoplePickerNavigationController。
第17章
-
问题1
:协议是
UIAccelerometerDelegate。 -
问题2
:三个事件是
motionBegan:、motionEnded:和motionCancelled:。 - 问题3 :第一代iPhone使用蜂窝塔三角测量和Wi - Fi三角测量来确定其位置,因为它没有内置的GPS接收器。第二代和第三代设备使用三种不同的方法。iPod Touch仅使用Wi - Fi三角测量,因为它既没有GPS接收器也没有蜂窝连接。
3. Xcode使用指南
3.1 Xcode简介
Xcode是苹果用于开发Mac OS X和iPhone应用程序的集成开发环境(IDE),它是一套应用程序,包括一组编译器、文档和Interface Builder。使用Xcode,可以在智能文本编辑器的舒适环境中构建iPhone应用程序,并借助许多不同的工具来调试应用程序。
3.2 启动Xcode
启动Xcode的方法如下:
- 最简单的方法是在Spotlight的文本框中输入
Xcode
。
- 也可以导航到
\Developer\iPhone OS <version_no>\Applications\
文件夹并双击Xcode图标。
为了方便起见,还可以将Xcode图标拖到Dock,以便将来直接从Dock启动它。目前Xcode的可用版本是3.1。
3.3 支持的项目类型
Xcode支持构建iPhone和Mac OS X应用程序。创建新项目时,会看到New Project对话框,主要有两种项目类型:iPhone OS和Mac OS X。在iPhone OS类别下,Application项又进一步分为两个类别:Navigation - based Application和Window - based Application。点击Application项会显示可以创建的所有项目类型,如下所示:
- Navigation - based Application
- Navigation - based Core Data Application
- OpenGL ES Application
- Tab Bar Application
- Utility Application
- View - based Application
- Window - based Application
- Window - based Core Data Application
选择要创建的项目类型并点击Choose按钮,然后需要为项目命名。项目创建后,Xcode会显示组成项目的所有文件。
3.4 Xcode窗口结构
Xcode窗口分为五个部分:
| 部分 | 说明 |
| — | — |
| 工具栏(Toolbar) | 显示常用操作的按钮 |
| 组和文件列表(Groups and Files List) | 显示项目中的文件,文件按文件夹和类别分组以便更好地管理 |
| 状态栏(Status bar) | 显示当前操作的状态信息 |
| 详细视图(Detail View) | 显示在组和文件列表部分中选定的文件夹和组中包含的文件 |
| 编辑器(Editor) | 显示当前选定文件的相应编辑器 |
3.5 编辑代码文件
要编辑代码文件,点击文件名以打开编辑器。根据点击的内容,会启动相应的编辑器。例如,点击
.h
或
.m
文件会显示可以编辑源代码的代码编辑器;点击
.plist
文件会启动XML Property List编辑器。
3.6 自定义工具栏
Xcode窗口的工具栏部分可以放置常用项目以便快速访问。默认情况下,工具栏中包含以下项目:
- 概述(Overview):允许选择目标设置,如活动SDK(iPhone OS版本以及设备与模拟器)以及活动配置(Debug或Release)。
- 操作(Action):指定可以对选定项执行的操作。
- 构建并运行(Build and Go):用于构建和部署应用程序。
- 任务(Tasks):停止正在进行的任何操作。
- 信息(Info):查看选定项的详细信息。
- 搜索(Search):过滤当前在详细视图部分中显示的项。
可以通过右键点击工具栏并选择Customize Toolbar来添加项目。此时会看到一个下拉面板,显示可以添加到工具栏的所有项目,将项目直接拖到工具栏即可添加。
3.7 Code Sense功能
Code Sense是Xcode中的代码补全功能。例如,在方法(如
viewDidLoad()
方法)中输入字母
UIA
时,Xcode会自动建议
UIAlertView
类。如果想接受建议的单词,只需按下Tab或Enter键。除了让Xcode自动完成单词,还可以通过按下Esc键(或按下F5)调用Code Sense功能,它会显示与输入内容匹配的单词列表。在Xcode中输入时,它会自动识别代码并插入相关参数的占位符。例如,调用对象的方法时,Xcode会插入各种参数的占位符。要接受各种参数的占位符,按下Tab键;要输入每个参数的值,可以按下相应键移动到每个参数,或者点击每个占位符并覆盖输入。
3.8 运行应用程序
运行应用程序的步骤如下:
1. 首先选择要使用的活动SDK,同时选择是要在真实设备上测试还是使用包含的iPhone Simulator,可从Overview列表中进行选择。
2. 按下Command - R,Xcode会构建并将应用程序部署到选定的设备或模拟器上。
3.9 Xcode使用流程总结
为了更清晰地展示使用Xcode进行开发的流程,下面用mermaid格式的流程图来呈现:
graph LR
A[启动Xcode] --> B[创建新项目]
B --> C{选择项目类型}
C --> |iPhone OS| D[配置项目信息]
C --> |Mac OS X| D
D --> E[编辑代码文件]
E --> F[自定义工具栏]
F --> G[利用Code Sense辅助编码]
G --> H[选择活动SDK和测试环境]
H --> I[运行应用程序]
这个流程图展示了从启动Xcode到最终运行应用程序的完整过程。首先启动Xcode,然后创建新项目,根据需求选择项目类型(iPhone OS或Mac OS X),接着配置项目信息,之后开始编辑代码文件,在编辑过程中可以自定义工具栏方便操作,利用Code Sense功能提高编码效率,完成编码后选择合适的活动SDK和测试环境,最后运行应用程序进行测试。
3.10 注意事项
在使用Xcode进行开发时,有一些注意事项需要了解:
-
SDK选择
:不同版本的SDK可能会对应用程序的功能和兼容性产生影响。在选择SDK时,要根据目标设备和应用程序的需求进行合理选择。例如,如果应用程序需要使用某些新的API,就需要选择支持这些API的SDK版本。
-
代码规范
:遵循良好的代码规范可以提高代码的可读性和可维护性。在编写代码时,要注意变量命名、代码注释、代码结构等方面的规范。例如,变量名要具有描述性,代码注释要清晰明了,代码结构要合理。
-
调试技巧
:Xcode提供了丰富的调试工具,如断点调试、日志输出等。在开发过程中,要善于利用这些工具来定位和解决问题。例如,在代码中设置断点,逐步执行代码,查看变量的值和程序的执行流程,从而找出问题所在。
4. 综合应用与实践建议
4.1 综合应用场景
将前面提到的硬件访问知识和Xcode开发技能结合起来,可以创建出功能丰富的应用程序。例如,可以开发一个基于位置的健身应用程序,利用加速度计检测用户的运动状态,使用Core Location获取用户的位置信息,通过Xcode进行开发和调试。具体实现步骤如下:
1.
需求分析
:明确应用程序的功能和目标用户,确定需要使用的硬件和技术。
2.
设计架构
:根据需求分析的结果,设计应用程序的架构,包括界面设计、数据存储、功能模块等。
3.
编码实现
:使用Xcode创建项目,根据设计架构编写代码,实现各个功能模块。在编码过程中,要注意代码的质量和性能。
4.
测试调试
:使用Xcode的调试工具对应用程序进行测试和调试,确保应用程序的稳定性和可靠性。
5.
发布上线
:将应用程序发布到App Store,供用户下载和使用。
4.2 实践建议
为了更好地掌握iOS开发技术,以下是一些实践建议:
-
多做练习
:通过完成各种练习题和小项目,加深对知识的理解和掌握。可以参考前面提到的各章习题,按照步骤进行实践。
-
阅读优秀代码
:阅读优秀的开源代码,学习他人的编程思路和技巧。可以在GitHub等开源平台上找到很多优秀的iOS项目。
-
参与技术交流
:加入iOS开发社区,参与技术交流和讨论,了解最新的技术动态和趋势。可以参加线下的技术会议和聚会,也可以加入线上的技术论坛和群组。
-
持续学习
:iOS开发技术不断发展和更新,要保持学习的热情和动力,持续学习新的知识和技能。可以关注苹果官方的开发者文档和技术博客,了解最新的技术信息。
5. 总结
本文介绍了iOS开发中硬件访问的相关知识,包括加速度计、Shake API、位置服务等的使用方法,同时提供了各章习题的详细解答,帮助读者巩固所学知识。此外,还详细介绍了Xcode的使用指南,包括启动方法、支持的项目类型、窗口结构、编辑代码、自定义工具栏、Code Sense功能以及运行应用程序等方面的内容。通过综合应用这些知识和技能,并遵循实践建议,读者可以更好地进行iOS开发,创建出功能强大、用户体验良好的应用程序。在实际开发过程中,要不断学习和实践,积累经验,提高自己的开发水平。
希望本文对iOS开发者有所帮助,祝愿大家在iOS开发的道路上取得成功!
超级会员免费看
20

被折叠的 条评论
为什么被折叠?



