iOS
发布时间:2022-03-31 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了《iPhone与iPad开发实战—iOS经典应用剖析》连载七,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
3.3.4主视图代码
在本应用中主视图中使用的视图是@H_221_7@mainView
,事实上在很多应用中我们不用为视图控制器@L_674_1@一个视图类的而是直接使用UIView
基类就可以了。由于本应用是按照旧版本的Xcode
模板编写的,我们还是按照旧版本介绍吧。在Cocoa MVC
设计模式中,视图中的控件在视图控制器或者视图中都要有对应的控件变量,没有@L_674_1@视图类的时候,这些控件变量是在视图控制器中定义的,有了@L_674_1@视图类后,这些控件变量可以在视图类中定义,本应用就是这样子的。
主视图类是@H_221_7@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
发送出去。
主视图类是@H_221_7@mainView
,它的@H_221_7@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>
下面我们分析一下上面的代码,在@H_221_7@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__)))
在主视图控制器@H_221_7@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
发送可以通过@H_221_7@mFMailComposeViewController
和@H_221_7@mFMailComposeViewControllerDelegate
发送,如果邮件中没有图片和附件也可以通过本应用采用的简单发送方式:
[[UIApplication sharedApplication] openURL:mailURL];
通过应用程序内部对象的openURL
方法发送E-Mail
,其中@H_221_7@mailURL
是一个特定格式的字符串其中,开头是@H_221_7@mailto
,其中主题部分subject
,内容部分body
,还有cc
等参数。
NSString *urlString = @"mailto:?subject=password%20Generator&body=";
iOS
中这个[UIApplication sharedApplication] openURL
方法可以做很多事情,其中可以:
·
@H_607_290@打开
浏览
@H_607_290@器,
格式“
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
文件这样定义@H_221_7@mainView
:
@interface MainView :UIView<UITextFieldDelegate> {}
而本应用中没有
<UITextFieldDelegate>
方式定义,这里涉及到Objective-C
的动态方法调用问题,与Java
等面向对象的语言不同的是,Objective-C
不用必须在声明中指定协议,而直接在@H_221_7@m
文件给出该协议的实现方法也是可以的。
@interface MainView : UIView {}
在textFieldShouldReturn
方法执行的时候判断当前的文本框是密码还是密码长度,从而放弃对应文本框的第一响应者。 [passwordresignFirstResponder]; [passwordLengthresignFirstResponder];
大佬总结
以上是大佬教程为你收集整理的《iPhone与iPad开发实战—iOS经典应用剖析》连载七全部内容,希望文章能够帮你解决《iPhone与iPad开发实战—iOS经典应用剖析》连载七所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。