治本文件字段和文件视图 <- iOS文本编程指南

文本字段和文件视图有有限个根本的职能:显示文本,以及兴输入和编制文本。
很多编程任务及这些概括的目标相关联,包括安排文本对象、访问时文件、检查用户的输入、以及显覆盖视图(例如在文本字段遭遇的书签按钮)。

UITextField或者UITextView对象的嘱托负责处理之中多数的职责。这些委托必须下UITextFieldDelegate或者UITextViewDelegate协议,并设中一个要多只方法。所有协议章程还是可选实现之。为了能调用这些方式,你得用编码的点子或Interface
Builder设置文本字段和文书视图的delegate属性。

叫寄发送的音之相继

在多数状况下,UITextField或UITextView类的实例会当加以的文本对象的率先响应者状态改变之早晚发送一文山会海名字好像的消息给它的委托。当用户点击一个文书对象,它见面活动成为第一响应者;所以系统回味该公文对象出示键盘并开始一个编辑会话。当用户点击任何一个文书对象或点击按钮来收场编辑的时节,当前的公文对象注销第一响应者状态。如果没有外文件对象吃捎,系统会隐藏键盘;另一方面,如果用户挑选了别一个文件对象,它会成为第一响应者,并且键盘会为该对象要存在。

对一般的行为发出星星点点独例外。在iPad上,如果视图控制器采用“form
sheet”样式模态呈现她的视图,显示的键盘不会见流失,直到用户点击关闭按钮或者模态视图控制器以编程的方关闭。这样设计之目的是免过多的卡通。另一个不同是自定义输入视图。输入视图可以代替分配受文本视图或于定义视图的inputView属性的系统键盘。当起输入视图的早晚,即使文本对象是第一响应者,UIKit也足以切换键盘。

文件视图和文件字段给它委托发送信息的一一如下:

  1. 每当文书对象刚刚成第一响应者之前——textFieldShouldBeginEditing:
    (文本字段) 和textViewShouldBeginEditing:
    (文本视图)。委托可以经返回YES(默认)或NO来校验是否将文件对象成第一响应者。
  2. 于文件对象刚刚成第一响应者之后——textFieldDidBeginEditing:
    (文本字段) 和 textViewDidBeginEditing:
    (文本视图)。委托可以透过诸如履新状态信息或于编写会话期间显得挂视图对该信息作出响应。
  3. 每当编制会话期间——当用户输入以及编辑文本的时,文本对象调用合适的信托方(如果实现)。例如,文本视图可以当文件改变时候,它的托可以接受textViewDidChange:消息。文本字段可以在用于点击它的破按钮的时节接受textFieldShouldClear:
    消息;委托返回布尔值来验证是不是清除文本。
    心想事成这些点子是为输入文本的行之有效。例如,如果文本应以给定的格式,那么以字符串未遵守格式的下委托该归NO。
  4. 于文件对象刚刚注销第一响应者之前——textFieldShouldEndEditing:
    (文本字段) 和 textViewShouldEndEditing:
    (文本视图)。实现这些措施的重中之重由是,验证输入的公文。例如,如果文本应抱给定的模式,如果输入的字符串不合乎给定的模式,该委托会返回NO。默认情况下回到的是YES。
    有关的文书字段的办法是textFieldShouldReturn:。当用户点击回车键的早晚,文本字段会发送textFieldShouldReturn:方法给寄,来打听她是不是应当取消第一响应者。
  5. 当文书对象刚刚注销第一响应着后————textFieldDidEndEditing:
    (文本字段) 和 textViewDidEndEditing:
    (文本视图)。委托可以实现这些方式来得到用户刚刚输入或编辑的文件。

文件视图和文件字段的率先响应者状态的改,可以通过观察通知来通知委托以外的对象。(但是,它们不克获准或拒绝新状态的通。)通知来名字,例如UITextFieldTextDidBeginEditingNotification,
UITextViewTextDidEndEditingNotification, 和
UITextViewTextDidChangeNotification。和textFieldDidEndEditing: 和
textViewDidEndEditing:一样,观察并拍卖UITextFieldTextDidEndEditingNotification

UITextViewTextDidEndEditingNotification通知是为着看相关的文件字段和文件视图。更多关于通过这些类似发送的通告的消息,参见UITextField
Class Reference 和 UITextView Class Reference 。

布置文本字段和文书视图

虽比如有由UIKit框架供的视图对象同,你日常需要在文件字段和文件视图显示之前安排它们。你得为此编程方式配置它们,也可采取以Interface
Builder中之性检查器来部署它们。这片种植方法,你都是于设置文本对象的特性。

产生一对性质对于文本视图和文书对象是广阔的,但是呢发部分属性对于每个项目的目标都是一定的,包括以下几单:

  • 文本特性——文本颜色、对齐方式、字体族、字体、以及字体尺寸。
  • 键盘——键盘类型、返回键名字、安全文件输入、以及电动启用的返回键,所有这些还通过UITextInputTraits商事声明。(注意,与公事视图相关联的全自动启用会车键,在点击时,它的行事同磨车键一样。)更多信息,参见“为文本对象配置键盘”。
  • 文本字段特有——边框、背景图片、禁用图片、清除按钮、以及展位文本。作为一个UIControl对象,文本字段也得发高亮、选择、启用、和外属性。
  • 文件视图特有——可编制状态、数据探测器(针对电话号码和URL连接)。因为文件视图继承自UIScrollView,你可以由此设置合适的性能个来管理滚动视图的行。

盯住多单文件字段或文本视图

有着的UITextFieldDelegate或UITextViewDelegate协议的办法,都发出一个性能来甄别文本字段或文本视图第一响应者状态的更动、值的变动、或者其他委托信息由之改动。如果只是生一个文件对象在当前之视图中显,该公文对象通过者的性质进行验证。但是,如果手上视图上面来差不多独公文字段或者文本视图,委托必须找到某种方式来指示该文件对象就是寄信息之靶子。

你可以下以下简单种艺术来确定:outlet或tag。对于outlet方法,声明一个outlet实例变量
(使用IBOutlet关键字),并成立一个outlet连接。在您的寄托方中,使用指针对照,测试传入的公文对象是不是和outlet指示的目标同。例如,假而你声明并接连了一个名为吧SSN的outlet。你的代码应该跟代码清单3-1近似。

代码清单 3-1 使用outlet识别传入的文本对象

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {

    if (textField == SSN) {

            // .....

            return NO;

        }

    return YES;

}

当你得以字符串值写副到文本对象被,而不光是取得她,那么为当视图中之这些文件对象定义outlet连接特别有因此,甚至是不可或缺之。

若果于tag方式,声明一组枚举常量,每个tag对诺一个常量。

enum {

    NameFieldTag = 0,

    EmailFieldTag,

    DOBFieldTag,

    SSNFieldTag

};

接下来经过编程方式还是Interface
Builder方式把收拾型值分配受文本对象的tag属性。(tag属性在UIView中声称了。)在信托方被,你可利用seitch语词来评估传入的公文对象的tag值,从而持续(如代码清单3-2所显示)。

文本清单 3-2 使用tag识别传入的文本对象

- (void)textFieldDidEndEditing:(UITextField *)textField {



    switch (textField.tag) {

        case NameFieldTag:

            // do something with this text field

            break;

        case EmailFieldTag:

             // do something with this text field

            break;

        // remainder of switch statement....

    }

}

取输入的公文并安装文本

在用户以文书字段或文本视图中输入或者编辑文本且编辑会话结束以后,委托将赢得文本,并将她存储在行使的数据模型中。对于访问输入文本的极端好之嘱托方是textFieldDidEndEditing:
(文本字段) 和 textViewDidEndEditing: (文本视图).

代码清单 3-3
演示了何等获取用户在文本字段被(使用tag值来以视图中区分多单文件字段)输入的文书。UITextField或者UITextView的text属性通过文件对象持后即展示的字符串。委托从该属性中获取字符串,并将它存储在一个字典对象中。如果该文本字段换没有字符串值(就是欠字段持有一个空字符串),该信托就概括的返。

代码清单 3-3 在文本字段受到取得输入的文本

- (void)textFieldDidEndEditing:(UITextField *)textField {

    if ([textField.text isEqualToString:@""])

        return;



    switch (textField.tag) {

        case NameFieldTag:

            [thePerson setObject:textField.text forKey:MyAppPersonNameKey];

            break;

        case EmailFieldTag:

            [thePerson setObject:textField.text forKey:MyAppPersonEmailKey];

            break;

        case SSNFieldTag:

            [thePerson setObject:textField.text forKey:MyAppPersonSSNKey];

            break;

        default:

            break;

    }

}

代码清单 3-4 显示了textViewDidEndEditing:
方法的落实,它起文本视图中得显示的字符串,并拿她存储于字典中。这个措施不要求文本视图注册也第一响应者。(resignFirstResponder方法在动作方法给调用之前受调用,该动作方法以用户以视图的用户界面上点击完成按钮的上给调用。)

代码清单 3-4 在文书视图中获取输入的文本

- (void)textViewDidEndEditing:(UITextView *)textView {

    NSString *theText = textView.text;

    if (![theText isEqualToString:@""]) {

        [thePerson setObject:theText forKey:MyAppPersonNotesKey];

    }

    doneButton.enabled = NO;

}

设若您用将字符串值写副文本对象(通常以从app的数据模型检索它们后),只需要简单的管字符串分配给文本对象的text属性即可。例如:

NSString *storedValue = [thePerson objectForKey:MyAppPersonEmailKey];
emailField.text = storedValue;

否之,给想使描绘副字符串的文本字段换或者文本视图(在是例子中时emailField)定义outlet是实用的。

于文书字段使用格式化器

格式化器对象活动分析在一定格式中的字符串,并且以欠字符串转换成代表数字、日期、或另价值的靶子;它们还可倒操作,把NSData、NSNumber、以及近似的目标转换为代表这些对象值的格式化字符串。Foundation框架提供抽象基础类NSFormatter和一定量只具体子类NSDateFormatter和NSNumberFormatter。始终这些看似,用户可以当文本字段输入类似下面的价值:

11/15/2010

-1,348.09

接下来app可以行使formatter对象将字符串分别转换为NSData对象及NSNumber对象。

下的代码清单,使用了日期格式化器对象的话明格式化器的行使。(当然,你可采用UIDatePicker对象来顶替文本字段输入日期,而增大日期格式化器的文件字段是其它一个取舍。)代码清单3-5中的代码,创建了一个NSDateFormatter对象,并且让它们分配了一个实例变量。它配备是日子格式化器来以日期的“短样式”,但是当某种程度上足响应日历、区域、以及时区的改。它还把今天的日子分配给加的格式作为占位字符串,以便用户在输入日期的时段有一个得以的模型。

代码清单 3-5 配置日期格式化器

- (void)viewDidLoad {
[super viewDidLoad];
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setGeneratesCalendarDates:YES];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];
[dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; // example: 4/13/10
DOB.placeholder = [NSString stringWithFormat:@"Example: %@", [dateFormatter stringFromDate:[NSDate date]]];
// code continues....
}

以您安排了日期格式化器之后,该信托可以调用格式化器的dateFromString:方法,来将输入的日子字符串转换为NSData对象。代码清单3-6亮了此过程。

代码清单3-6 使用NSDateFormatter对象,把日子字符串转化为多少对象

- (void)textFieldDidEndEditing:(UITextField *)textField {
[textField resignFirstResponder];
if ([textField.text isEqualToString:@""])
return;
switch (textField.tag) {
case DOBField:
NSDate *theDate = [dateFormatter dateFromString:textField.text];;
if (theDate)
[inputData setObject:theDate forKey:MyAppPersonDOBKey];
break;
// more switch case code here...
default:
break;
}
}

运了格式化器并无可知保证输入的字符串必定包含了有效值(例如,用户可输入13用作格里高利日历的月份值)。为了保证用户输入正确的值,委托必须验证字符串,这片每当印证输入文本中已经说明了。因为证实时要求曾知晓之格式和有效值的限量,如果您想代码清单3-5那样安排日期格式化器,以便其对不同的日历与区域敏感,则无法自然的明该格式。想使指定一个曾清楚之日子格式,通过调用setDateFormat:来部署日期格式化器,给她传递一个经过Unicode标准定义的格式模型。

你还可以上面演示的过程反过来:把数据对象转换成为通过调用NSDateFormatter的艺术stringFromDate:生成的字符串,然后将欠字符串分配给文本字段、文本视图或者标签的text属性。

再度多关于NSDateFormatter和NSNumberFormatter的音讯,参见Data Formatting
Guide。

说明输入的文件

App有时候不克接在文件字段和文件视图中输入的无认证的字符串。或许该字符串必须是某种格式,也还是该值必须以一定范围里边。验证输入字符串最好的信托方,对于文本字段来说是textFieldShouldEndEditing:,对于文本视图来说是textViewShouldEndEditing:。这些方法以文书字段或文本视图注册也率先响应者之前调用。返回NO来防范这种景象的有,因此文本对象依然是编辑的机要。如果输入的字符串是行不通的,你还应有亮警告来提示用户这个错误。

代码清单3-7用正则表达式来证实在“社会保障号码”字段受到输入的字符串是否合乎一定的格式。

代码清单 3-7 实用正则表达式验证文本字段的字符串格式

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
if (textField == SSN) { // SSN is an outlet
NSString *regEx = @"[0-9]{3}-[0-9]{2}-[0-9]{4}";
NSRange r = [textField.text rangeOfString:regEx options:NSRegularExpressionSearch];
if (r.location == NSNotFound) {
UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"Entry Error"
message:@"Enter social security number in 'NNN-NN-NNNN' format"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
[av show];
return NO;
}
}
return YES;
}

以代码清单3-8遭到,实现了textViewShouldEndEditing:方法,强制限制了在文件视图中输入的文书的字符数。

代码清单 3-8 验证文本视图允许的字符串长度

- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
if (textView.text.length > 50) {
UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"Entry Error"
message:@"You must enter less than 50 characters." delegate:self cancelButtonTitle:@"OK"
otherButtonTitles:@"Clear", nil] autorelease];
[av show];
return NO;
}
return YES;
}

信托尚足以经过实现textField:shouldChangeCharactersInRange:replacementString:方法,来说明在文本字段被输入的每个字符。代码清单3-9负之代码,验证了每个输入的字符(字符串)代表一个数字。(你可经过给文本字段指定UIKeyboardTypeNumberPad键盘来贯彻同的对象。)

代码清单 3-9 验证每个输入的字符

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
if ([string isEqualToString:@""]) return YES;
if (textField.tag == SalaryFieldTag) {
unichar c = [string characterAtIndex:0];
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]) {
return YES;
} else {
return NO;
}
}
return YES;
}

卿可以实现textField:shouldChangeCharactersInRange:replacementString:方法,在用户输入文本的上提供单词的或是完整性和重复凑巧效应。

每当文本字段遭遇采取覆盖视图

蒙视图是一个安插到文本字段左侧或右的小视图。作为控件,当用户点击它的时光,可以操作文本字段当前底情。搜索以及书签是挂视图的点滴种植常见任务,但是别为是可能的。覆盖视图可以行使文本字段被(部分)URL加载web浏览器:

相思如果兑现覆盖视图,创建一个暨文书字段高度尺寸匹配的视图,并让该视图一个恰当尺寸的图纸。如果该视图是一个按钮或其他空间,请指定目标靶、动作选择器、和接触控件事件。通常来说,你要当文本字段聚焦为编辑的早晚起覆盖视图,所以管它分配受textFieldDidBeginEditing:
委托方吃之leftView
或者rightView属性。在编制会话期间(例如在用户输入文本之前,或者用户刚刚开始输入文本下),在盖视图出现的时段,你得由此将UITextFieldViewMode常量分配受leftViewMode或rightViewMode属性进行支配。代码清单3-10演示了怎么兑现覆盖视图。

代码清单 3-10以文本字段被显覆盖视图。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
if (textField.tag == NameField && self.overlayButton) {
textField.leftView = self.overlayButton;
textField.leftViewMode = UITextFieldViewModeAlways;
}
}
@dynamic overlayButton;
- (UIButton *)overlayButton {
if (!overlayButton) {
overlayButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
UIImage *overlayImage = [UIImage imageNamed:@"bookmark.png"];
if (overlayImage) {
[overlayButton setImage:overlayImage forState:UIControlStateNormal];
[overlayButton addTarget:self action:@selector(bookmarkTapped:)
forControlEvents:UIControlEventTouchUpInside];
}
}
return overlayButton;
}

倘若您想利用覆盖视图的空间,请保管落实了该动作方法。

假使惦记换除掉覆盖视图,只要以textFieldDidEndEditing:委托方吃,将leftView或者rightView属性简单设置为nil即可。参照代码清单3-11。

代码清单 必发娱乐最新官方网址3-11移除覆盖视图

- (void)textFieldDidEndEditing:(UITextField *)textField {
if (textField.tag == NameFieldTag) {
textField.leftView = nil;
}
// remainder of implementation....
}

盯住文本视图中之所选部分

UITextViewDelegate中之方textViewDidChangeSelection:让您得跟用户在文件视图中所挑选一些的修改。你可以兑现方式来取得选择有的子字符串,并针对性它们进行操作。代码清单3-12
是一个奇怪的事例,它于所选子字符串的字符都改为大写。

代码清单 3-12 获取选中的子字符串并改变它

- (void)textViewDidChangeSelection:(UITextView *)textView {
NSRange r = textView.selectedRange;
if (r.length == 0) {
return;
}
NSString *selText = [textView.text substringWithRange:r];
NSString *upString = [selText uppercaseString];
NSString *newString = [textView.text stringByReplacingCharactersInRange:r withString:upString];
textView.text = newString;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注