《iPhone与iPad开发实战—iOS经典应用剖析》连载八

简介: <span style="font-size:18px"><strong>3.3.5 <span style="font-family:黑体">主视图控制器代码</span></strong></span><br><br><span style="font-family:宋体">主视图控制器是</span>MainViewController<span style="font-family
3.3.5 主视图控制器代码

主视图控制器是MainViewController ,由于视图使用的控件都已经在视图MainView 中定义了,所以在视图控制器MainViewController 代码很少了,在本应用中还设计了按钮按下和按钮选择时候的普通和高亮状态效果。这些效果可以在检查器中设定,也可以通过代码设定,本应用是通过代码设定这些效果。
先看看主视图控制器类MainViewController ,它的h 文件定义请参考“代码清单3-5Password/Classes/MainViewController.h ”所示。
【代码清单3-1】 Password/Classes/MainViewController.h
#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController {
IBOutletUIButton *createPassword;
IBOutletUIButton *emailPassword;
}
@property (nonatomic, retain) UIButton*createPassword;
@property (nonatomic, retain) UIButton*emailPassword;

@end


createPassword Generate Password 对应的控件变量,emailPassword E-Mail Password 对应的控件变量,它们都定义了输出口,这是因为它们都需要在程序中改变控件状态。
主视图控制器类MainViewController ,它的m 文件定义请参考“代码清单3-6Password/Classes/ MainViewController.m ”所示。
【代码清单3-2】 Password/Classes/ MainViewController.m
#import "MainViewController.h"
#import "MainView.h"

@implementation MainViewController

@synthesize createPassword;
@synthesize emailPassword;

- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {
if(self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

}
returnself;
}


- (void)viewDidLoad {
UIImage*buttonBackground = [[UIImage imageNamed:@"blueButton.png"]stretchableImageWithLeftCapWidth:12.0 topCapHeight:12.0 ];
[createPasswordsetBackgroundImage:buttonBackground forState:UIControlStateNormal];
[emailPasswordsetBackgroundImage:buttonBackground forState:UIControlStateNormal];

[createPasswordsetTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[emailPasswordsetTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

UIImage*buttonBackgroundSel = [[UIImage imageNamed:@"whiteButton.png"]stretchableImageWithLeftCapWidth:12.0 topCapHeight:12.0 ];
[createPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateHighlighted];
[createPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateSelected];
[emailPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateHighlighted];
[emailPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateSelected];

[createPasswordsetTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
[createPasswordsetTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
[emailPasswordsetTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
[emailPasswordsetTitleColor:[UIColor blackColor] forState:UIControlStateSelected];

}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
//Return YES for supported orientations
return(interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
//Release anything that's not essential, such as cached data
}


- (void)dealloc {
[emailPasswordrelease];
[createPasswordrelease];
[superdealloc];
}


@end


其中viewDidLoad 方法是我们讨论的重点,其中通过下面的方法定义了一个UIImage 对象:
UIImage *buttonBackground = [[UIImageimageNamed:@"blueButton.png"] stretchableImageWithLeftCapWidth:12.0topCapHeight:12.0 ];
该方法是通过拉伸创建一个UIImage ,而边角不拉伸,需要两个参数,第一个是不拉伸区域和左边框的宽度,第二个参数是不拉伸区域和上边框的宽度。
把这个拉伸的UIImage 对象作为两个按钮的正常状态时候背景图片:
[createPassword setBackgroundImage:buttonBackgroundforState:UIControlStateNormal];
[emailPassword setBackgroundImage:buttonBackgroundforState:UIControlStateNormal];
接下来又定义了一个UIImage 对象,作为按钮其它状态(高亮状态UIControlStateHighlighted 和选中状态UIControlStateSelected )时候的背景图片,
[createPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateHighlighted];
[createPasswordsetBackgroundImage:buttonBackgroundSel forState:UIControlStateSelected];
然后,又定义了按钮在高亮状态和选中状态时候的文字背景颜色:
[createPassword setTitleColor:[UIColor blackColor]forState:UIControlStateHighlighted];
[createPassword setTitleColor:[UIColor blackColor]forState:UIControlStateSelected];

3.3.6 背后视图UI
背后面视图如图3-43 所示是FlipsideView (背后视图)设计窗口,我们一步一步介绍如何实现该视图设计和编程。




3-43 FlipsideView 视图设计窗口
背后视图中的控件进行了编号,视图中的控件内容见表3-8 所示。
3-8 FlipsideView 视图中的控件
                                    
  编号
  
  控件项目
  
  控件类型
  
  1
  
  Check out our other applications.
  
  UILabel
  
  2
  
  图片控件
  
  UIImageView
  
  3
  
  iFlame is a virtual lighter…
  
  UITextView
  
  4
  
  Download
  
  UIButton
  
  5
  
  Don't be caught without a light…
  
  UITextView
  
[color=windowtext -moz-use-text-color] 从图3-42 可以看到这些控件不包含如图3-44 所示导航栏和Done ,导航栏和Done 不用在FlipsideView.xib 文件中设计好,而是通过程序代码动态添加的,代码是在RootViewController.m loadFlipsideViewController 方法实现的。



3-44 FlipsideView 视图中的导航栏
我们可以按照表3-8 一一添加这些控制,需要注意的是1 号控件是UILabel ,而3 5 号控件是UITextView ,当有很多的文本内容需要显示的时候就要使用UITextView 控件而不是UILabel 。这个视图设计过程细节就不再一一介绍了。
  3.6.7 背后面视图和视图控制器代码
背后视图主要实现了2 个功能:导航栏中的Done 按钮和视图中Download 按钮,其中导航栏中的Done 功能的实现是在RootViewController.m 类的toggleView 方法中已经实现了,而不是在FlipsideView.m FlipsideViewController.m 中实现的。
Download 按钮是通过浏览器打开在App Store 上一个iFlame 应用,该功能是在FlipsideView.m 中实现的。
我们先看看FlipsideView.h 代码请参考“代码清单3-7 Password/Classes/ FlipsideView.h ”所示。
【代码清单3-1】 Password/Classes/ FlipsideView.h
#import <UIKit/UIKit.h>

@interface FlipsideView : UIView {
}

- (IBAction)openLink;

@end
其中的openLink 方法是响应Download 按钮事件。FlipsideView.m 代码请参考“代码清单3-8 Password/Classes/ FlipsideView.m ”所示。
【代码清单3-2】 Password/Classes/ FlipsideView.m
#import "FlipsideView.h"

@implementation FlipsideView


- (id)initWithFrame:(CGRect)frame {
if(self = [super initWithFrame:frame]) {
//Initialization code
}
returnself;
}


- (void)drawRect:(CGRect)rect {
//Drawing code
}


- (void)dealloc {
[superdealloc];
}

-(IBAction) openLink {
//open in Safari
//[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.apple.com/"]];

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=287545019&mt=8"]];

}


@end


上面的代码主要的方法是openLink ,通过该方法在iOS 浏览器中打开一个网页。其中使用[UIApplication sharedApplication] openURL: 方法,该方法介绍E-Mail 发送功能时候已经介绍了,它可以打开多种应用程序。
本章小结
通过对本章的学习,读者可以掌握密码生成应用程序(Amuck Password Generator )应用开发过程,重点是一些基本控件设计和使用过程,这些控件包括:UIView UIButton UILabel 等,学会使用Interface Builder ,在Interface Builder 设计这些控件,设定它们的属性。
读者还可以了解MVC 设计模式、实用型应用程序模板等概念,Cocoa Cocoa Touch MVC 设计模式最为重要的设计模式,只有能够真正的理解好MVC 设计模式,才能做好iOS 开发,才能理解nib 文件、视图和视图控制器这些概念。UIView 级别动画是iOS 比较简单但很常用的动画,UIView 级别动画必须放在[UIView beginAnimations:nilcontext:NULL] [UIViewcommitAnimations] 语句之间,其中包括了设定动画持续时间、动画转变类型和动画曲线等动画属性的设定。
此外,读者还可以掌握[UIApplication sharedApplication] openURL: 方法的使用,iOS 中这个[UIApplication sharedApplication]openURL 方法可以做很多事情,其中包括:打开浏览器、打开Google 地图、拨打电话、发送短信和发送Email 等等。
目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
157 4
|
1月前
|
编解码 测试技术 开发工具
测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果
【10月更文挑战第23天】测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果是确保应用质量和用户体验的重要环节。通过手动测试、自动化测试、视觉效果评估、性能测试、用户体验测试等多种方法的综合运用,能够全面地发现应用在响应式效果方面存在的问题,并及时进行解决和优化。同时,持续的测试和优化也是不断提升应用质量和用户满意度的关键。
|
2月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
2月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
77 1
|
4月前
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
33 2
|
1月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
59 1
|
1月前
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
62 5