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

简介: <span style="font-size:18px"><strong>3.3.4<span style="font-family:黑体">主视图代码</span></strong></span><br><br><span style="font-family:宋体">在本应用中主视图中使用的视图是</span>MainView<span style="font-family:宋体">,
3.3.4主视图代码

在本应用中主视图中使用的视图是MainView ,事实上在很多应用中我们不用为视图控制器自定义一个视图类的而是直接使用UIView 基类就可以了。由于本应用是按照旧版本的Xcode 模板编写的,我们还是按照旧版本介绍吧。在Cocoa MVC 设计模式中,视图中的控件在视图控制器或者视图中都要有对应的控件变量,没有自定义视图类的时候,这些控件变量是在视图控制器中定义的,有了自定义视图类后,这些控件变量可以在视图类中定义,本应用就是这样子的。
主视图类是MainView ,它的h 文件定义请参考“代码清单3-3Password/Classes/MainView.h ”所示。
【代码清单3-1】 Password/Classes/MainView.h
<pre class="brush:objc; toolbar: true; auto-links: false;">

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface MainView : UIView {
IBOutletUITextField *passwordLength;
IBOutletUITextField *emailAddress;
IBOutletUISwitch *includeLowerCase;
IBOutletUISwitch *includeNumbers;
IBOutletUISwitch *includePunctuation;
IBOutletUISwitch *includeUpperCase;
IBOutletUISwitch *showPhonetics;
IBOutletUITextField *password;
IBOutletUITextView *phoneticPassword;
IBOutletUIButton *emailPasswordButton;
}

@property (nonatomic, retain) UITextField*emailAddress;
@property (nonatomic, retain) UITextView*phoneticPassword;
@property (nonatomic, retain) UITextField*passwordLength;
@property (nonatomic, retain) UIButton*emailPasswordButton;

- (IBAction)setPasssword;
- (IBAction)resignResponder;
- (IBAction)emailPassword;

@end
</pre>
从“代码清单3-3 Password/Classes/MainView.h ”可以看到定义的控件变量,这需要注意的是在本应用中这些变量都定义了IBOutlet (输出口)其实没有这个必要,一个控件是否定义输出口要看是否需要通过程序修改其属性。此外还定义了3 个方法,setPasssword 方法是响应Generate Password 按钮事件,resignResponder 是放弃第一响应者方法,在文本框等控件中可以输入数据,输入数据过程中会出现键盘,通过文本框放弃第一响应者后才能关闭键盘。emailPassword 是响应E-Mail Password 按钮事件把产生的密码通过E-Mail 发送出去。
主视图类是MainView ,它的m 文件定义请参考“代码清单3-4Password/Classes/MainView.m ”所示。
【代码清单3-2】 Password/Classes/MainView.m
<pre class="brush:objc; toolbar: true; auto-links: false;">

#import "MainView.h"

#define RANDOM_SEED() srandom(time(NULL))
#define RANDOM_INT(__MIN__, __MAX__) ((__MIN__) +random() % ((__MAX__+1) - (__MIN__)))

@implementation MainView

@synthesize phoneticPassword;
@synthesize passwordLength;
@synthesize emailPasswordButton;
@synthesize emailAddress;

- (id)initWithFrame:(CGRect)frame {
if(self = [super initWithFrame:frame]) {

}
returnself;
}

- (IBAction)setPasssword {

[UIViewbeginAnimations:nil context:NULL];
[UIViewsetAnimationDuration:1];
[passwordsetAlpha:0.0];
[phoneticPasswordsetAlpha:0.0];
[emailPasswordButtonsetAlpha:0.0];
[UIViewcommitAnimations];

[UIViewbeginAnimations:nil context:NULL];
[UIViewsetAnimationDuration:1];
[passwordsetAlpha:0.85];
if(showPhonetics.on){[phoneticPassword setAlpha:0.85];}
[emailPasswordButtonsetAlpha:0.85];
[UIViewcommitAnimations];

… …

}

-(IBAction) resignResponder {
[passwordresignFirstResponder];
[passwordLengthresignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField*)textField {
if(textField == password) {
[passwordresignFirstResponder];
}
if(textField == passwordLength) {
[passwordLengthresignFirstResponder];
}
returnYES;
}

-(IBAction) emailPassword {

NSString*urlString = @"mailto:?subject=Password%20Generator&body=";
urlString= [urlString stringByAppendingString:@"Password:%20"];
urlString= [urlString stringByAppendingString:password.text];
if(showPhonetics.on){
urlString= [urlString stringByAppendingString:@"%20Phonetic:%20"];
urlString= [urlString stringByAppendingString:[phoneticPassword.textstringByReplacingOccurrencesOfString:@" "withString:@"%20"]];
}

NSURL*mailURL = [NSURL URLWithString: urlString];
[[UIApplicationsharedApplication] openURL: mailURL];
}


@end

</pre>
下面我们分析一下上面的代码,在m 文件的开始定义了两个宏RANDOM_SEED RANDOM_INT RANDOM_SEED 产生随机数种子值,RANDOM_INT 是参数随机数,其中函数srandom() random() time() 都是C 语言中的函数。
#define RANDOM_SEED() srandom(time(NULL))
#define RANDOM_INT(__MIN__, __MAX__) ((__MIN__) +random() % ((__MAX__+1) - (__MIN__)))
在主视图控制器m 文件中最为主要的几个方法是:setPasssword emailPassword resignResponder textFieldShouldReturn: 其中前3 个方法是有关事件处理的,下面我们一一介绍一下这几个方法。
setPasssword 方法是主要实现了密码的计算和视图中下面3 个控件的动画显示。关于如何计算和产生密码,本书就不再介绍了。在本方法里我们重点研究视图中3 个控件的动画显示问题,这部分的动画也属于UIView 级别动画,使用UIViewbeginAnimations: 开始UIViewcommitAnimations 结束,事实上这是两个动画,先是通过下面的代码将3 个控件Alpha 设置为0.0 ,即不可见。
[UIViewbeginAnimations:nil context:NULL];
[UIViewsetAnimationDuration:1];
[passwordsetAlpha:0.0];
[phoneticPasswordsetAlpha:0.0];
[emailPasswordButtonsetAlpha:0.0];
[UIViewcommitAnimations];
然后再通过下面的代码将3 个控件Alpha 设置为0.85 ,即可见但是还有一点模糊的效果。这样两个动画分别作用于3 个控件,如果控件不可见,控件就变成可见,如果控件已经可见,就先变成不可见,再可见。持续时间都是1 秒钟。
[UIViewbeginAnimations:nil context:NULL];
[UIViewsetAnimationDuration:1];
[passwordsetAlpha:0.85];
if(showPhonetics.on){[phoneticPassword setAlpha:0.85];}
[emailPasswordButtonsetAlpha:0.85];
[UIViewcommitAnimations];
emailPassword 方法是将密码通过E-Mail 发送出去,其中在iOS E-Mail 发送可以通过MFMailComposeViewController MFMailComposeViewControllerDelegate 发送,如果邮件中没有图片和附件也可以通过本应用采用的简单发送方式:
[[UIApplication sharedApplication] openURL:mailURL];
通过应用程序内部对象的openURL 方法发送E-Mail ,其中mailURL 是一个特定格式的字符串其中,开头是mailto ,其中主题部分subject ,内容部分body ,还有cc 等参数。
NSString *urlString = @"mailto:?subject=Password%20Generator&body=";
iOS 中这个[UIApplication sharedApplication] openURL 方法可以做很多事情,其中可以:
· 打开 浏览 器, 格式“ http://itunesconnect.apple.com ”;
· 打开 Google 地图,格式“ http://maps.google.com/maps?q=${QUERY_STRING} ”,这是使用 Web 浏览器方式打开地图,其中 q 是查询的参数,例如:经纬度等信息,在 iOSSDK 中还可以通过本地 API 方式打开地图;
· 拨打电话,格式“tel://10086 ”;
· 发送短信,格式“sms://10086 ”。
但是要注意的是除了打开浏览器可以在模拟器上打开,其它的几个包括E-Mail的发送,都是不能在模拟器上打开,必须在真机上打开的。

resignResponder textFieldShouldReturn: 都是放弃第一响应的,经过测试本应用中的resignResponder 方法并没有触发,没有实际意义,而textFieldShouldReturn: 方法起到了作用,该方法是来源于UITextFieldDelegate 协议中的方法,在iOS delegate (委托)是一种设计模式,它通过一个协议(类似于Java 中的接口)定义,要求它的实现类必须实现它的方法,这些方法将在某些事件发生的时候被触发(或回调)。- (BOOL)textFieldShouldReturn: 方法就是在文本框编辑状态时候,点击键盘的回车按钮时候触发的方法。
事实上我们需要在主视图的h 文件这样定义MainView
@interface MainView :UIView<UITextFieldDelegate> {}
而本应用中没有 <UITextFieldDelegate> 方式定义,这里涉及到Objective-C 的动态方法调用问题,与Java 等面向对象的语言不同的是,Objective-C 不用必须在声明中指定协议,而直接在m 文件给出该协议的实现方法也是可以的。
@interface MainView : UIView {}
textFieldShouldReturn 方法执行的时候判断当前的文本框是密码还是密码长度,从而放弃对应文本框的第一响应者。
[passwordresignFirstResponder];
[passwordLengthresignFirstResponder];
目录
相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
235 4
|
2月前
|
编解码 测试技术 开发工具
测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果
【10月更文挑战第23天】测试 iPhone 应用在不同屏幕尺寸和分辨率下的响应式效果是确保应用质量和用户体验的重要环节。通过手动测试、自动化测试、视觉效果评估、性能测试、用户体验测试等多种方法的综合运用,能够全面地发现应用在响应式效果方面存在的问题,并及时进行解决和优化。同时,持续的测试和优化也是不断提升应用质量和用户满意度的关键。
|
3月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
3月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
81 1
|
5月前
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
41 2
|
2月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
76 1
|
2月前
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
68 5