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

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

 


createPasswordGenerate 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.mloadFlipsideViewController方法实现的。


3-44 FlipsideView视图中的导航栏
我们可以按照表3-8一一添加这些控制,需要注意的是1号控件是UILabel,而35号控件是UITextView,当有很多的文本内容需要显示的时候就要使用UITextView控件而不是UILabel。这个视图设计过程细节就不再一一介绍了。
       Normal  0        7.8 磅  0  2    false  false  false    EN-US  ZH-CN  X-NONE                                                                                                                                                                                                                                                                                                                                                                                       3.6.7 背后面视图和视图控制器代码
背后视图主要实现了2个功能:导航栏中的Done按钮和视图中Download按钮,其中导航栏中的Done功能的实现是在RootViewController.m类的toggleView方法中已经实现了,而不是在FlipsideView.mFlipsideViewController.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)应用开发过程,重点是一些基本控件设计和使用过程,这些控件包括:UIViewUIButtonUILabel等,学会使用Interface Builder,在Interface Builder设计这些控件,设定它们的属性。
读者还可以了解MVC设计模式、实用型应用程序模板等概念,CocoaCocoa TouchMVC设计模式最为重要的设计模式,只有能够真正的理解好MVC设计模式,才能做好iOS开发,才能理解nib文件、视图和视图控制器这些概念。UIView级别动画是iOS比较简单但很常用的动画,UIView级别动画必须放在[UIView beginAnimations:nilcontext:NULL][UIViewcommitAnimations]语句之间,其中包括了设定动画持续时间、动画转变类型和动画曲线等动画属性的设定。
此外,读者还可以掌握[UIApplication sharedApplication] openURL:方法的使用,iOS中这个[UIApplication sharedApplication]openURL方法可以做很多事情,其中包括:打开浏览器、打开Google地图、拨打电话、发送短信和发送Email等等。

posted @ 2012-06-15 15:42  516inc  阅读(325)  评论(0编辑  收藏  举报