IOS系列——TextView和UITextField

原文來源於:http://blog.csdn.net/focusjava/article/details/12571973

一、textField

(一)、屬性

1.UITextField的初始化和設置
textField = [[UITextField alloc] initWithFrame:CGRectMake(120.0f, 80.0f, 150.0f, 30.0f)]; 
  [textField setBorderStyle:UITextBorderStyleRoundedRect]; //外框類型 
//如果出現UITextField不顯示的情況,很可能是沒設置其BorderStyle

2、默認顯示的字
textField.placeholder = @"password"; 
3、設置文本框爲密碼狀態
textField.secureTextEntry = YES; //密碼 
  textField.autocorrectionType = UITextAutocorrectionTypeNo; 
  textField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
  textField.returnKeyType = UIReturnKeyDone; 
  textField.clearButtonMode = UITextFieldViewModeWhileEditing; //編輯時會出現個修改X 
textField.delegate = self;

(二)、實現delegate的方法

1、關閉鍵盤
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
  { 
      [self.textField resignFirstResponder]; 
      return YES; 
  } 

(三)、可以在UITextField使用下面的方法按return鍵返回


-(IBAction) textFieldDone:(id) sender
{
 [textFieldName resignFirstResponder]; 
}
鏈接TextField控件的"Did end on exit"
最右側加圖片是以下代碼,
UIImageView *imgv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]];
    text.rightView=imgv;
    text.rightViewMode = UITextFieldViewModeAlways;


如果是在最左側加圖片就換成:
text.leftView=imgv;
text.leftViewMode = UITextFieldViewModeAlways; 
UITextField 繼承自 UIControl,此類中有一個屬性contentVerticalAlignment
所以想讓UITextField裏面的text垂直居中可以這樣寫:
text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;


文本框常用方法:

用程序刪除文本框中選中的文本
[textView delete: nil];
限制文本框只能輸入數字:
建立NSNumberFormatter的子類,增加這個方法,將formatter鏈接至文本框。
- (BOOL) isPartialStringValid: (NSString **) partialStringPtr
        proposedSelectedRange: (NSRangePointer) proposedSelRangePtr
               originalString: (NSString *) origString
        originalSelectedRange: (NSRange) origSelRange
             errorDescription: (NSString **) error
{
    NSCharacterSet *nonDigits;
    NSRange newStuff;
    NSString *newStuffString;
            
    nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    newStuff = NSMakeRange(origSelRange.location,
                           proposedSelRangePtr->location
                           - origSelRange.location);
    newStuffString = [*partialStringPtr substringWithRange: newStuff];
            
    if ([newStuffString rangeOfCharacterFromSet: nonDigits
                                                                                             options: NSLiteralSearch].location != NSNotFound) {
        *error = @"不是數字";
        return (NO);
    } else {
        *error = nil;
        return (YES);
    }
            
}


從文本框獲取十六進制數據的代碼
char singleNumberString[3] = {'\0','\0','\0'};
uint32_t singleNumber = 0;
uint32_t i = 0;
 NSMutableData *data = [NSMutableData data];
 //從文本框獲取到得數據
 const char *buf = [[_hexToSendTextField text] UTF8String];
 //轉換爲十六進制
 for(i = 0; i < strlen(buf); i+=2)
 {
 if(((i+1) < len && isxdigit(buf) && (isxdigit(buf[i+1])))
 {
 singleNumberString[0] = buf;
 singleNumberString[1] = buf[i+1];
 sscanf(singleNumberString, "%x", &singleNumber);
 [data appendBytes:(void*)(&tmp) length:1];
 }
 else
 {
 break;
 }
 }
 //輸出
 NSLog(@"%@", data);
點擊 UITextView 輸入文字,光標都從最初點開始
- (void)textViewDidChangeSelection:(UITextView *)textView
{
    NSRange range;
    range.location = 0;
    range.length = 0;
    textView.selectedRange = range;
}

軟鍵盤
在登錄頁面要實現用戶名和密碼,密碼要是點點格式,引入當前頁面光標要停留在用戶名選項,軟鍵盤要彈出界面。如下圖:
彈出鍵盤:
[username becomeFirstResponder];
取消鍵盤:
[username resignFirstResponder];
密碼保護:
password.secureTextEntry=YES;
限制輸入文本的長度
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (range.location >= MAX_LENGTH)
        return NO; // return NO to not change text
    return YES;
}
if (textField.text.length >= 10 && range.length == 0)
    return NO;
return YES;
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
 if ([textField.text length] > MAXLENGTH) 
 { 
  textField.text = [textField.text substringToIndex:MAXLENGTH-1]; 
  return NO; 
 } 
 return YES; 
} 
限制文本長度或者只可以輸入數字
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    // Check for non-numeric characters
    NSUInteger lengthOfString = string.length;
    for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {//只允許數字輸入
        unichar character = [string characterAtIndex:loopIndex];
        if (character < 48) return NO; // 48 unichar for 0
        if (character > 57) return NO; // 57 unichar for 9
    }
    // Check for total length
    NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
    if (proposedNewLength > 3) return NO;//限制長度
    return YES;
}

使用UITextFieldDelegate來隱藏鍵盤 
在iPhone界面上,時常會需要當用戶輸入完內容後,隱藏鍵盤。 當然有很多方法,今天只介紹使用UITextFieldDelegate這個協議實現隱藏鍵盤。
其實很簡單, 需要三步:
1. 在你的控制器類中,加入UITextFieldDelegate這個協議
如:@interface AddItemViewController : UIViewController <UITextFieldDelegate>
2. 在使用了UITextFieldDelegate協議的控制器類的實現中,加入- (BOOL)textFieldShouldReturn:方法。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
 
        [textField resignFirstResponder];
        return YES;
}

[UITextField becomeFirstResponder]; //設置焦點

3. 將xib文件中的TextField控件的delegate變量指向到之前使用UITextFieldDelegate協議的那個控制器類,將 TextField的delegate IBOutlet變量右鍵鏈接到前面的控制器類的實例上。或者使用代碼方式,指定相關TextField的delegate變量。
- (void)viewDidLoad 
{
    [super viewDidLoad];
        itemNameField.delegate = self;
        priceField.delegate = self;
}

二、TextView

(一)、基本屬性

self.textView
 = [[[UITextView alloc] initWithFrame:self.view.frame] autorelease]; //初始化大小並自動釋放
self.textView.textColor= [UIColor blackColor];//設置textview裏面的字體顏色
self.textView.font= [UIFont fontWithName:@"Arial" size:18.0];//設置字體名字和字體大小
self.textView.delegate =self;//設置它的委託方法
self.textView.backgroundColor= [UIColor whiteColor];//設置它的背景顏色
self.textView.text= @"原始顯示文字";//設置它顯示的內容
self.textView.returnKeyType= UIReturnKeyDefault;//返回鍵的類型
self.textView.keyboardType = UIKeyboardTypeDefault;//鍵盤類型
self.textView.scrollEnabled = YES;//是否可以拖動
self.textView.autoresizingMask= UIViewAutoresizingFlexibleHeight;//自適應高度
[self.view addSubview: self.textView];//加入到整個頁面中

(二)、 UITextView退出鍵盤的幾種方式


(1)如果你程序是有導航條的,可以在導航條上面加多一個Done的按鈕,用來退出鍵盤,當然要先實UITextViewDelegate。

代碼如下:

-(void)textViewDidBeginEditing:(UITextView *)textView {  
 UIBarButtonItem *done =    [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(leaveEditMode)] autorelease];  
self.navigationItem.rightBarButtonItem = done;      
}

-(void)textViewDidEndEditing:(UITextView *)textView {  
self.navigationItem.rightBarButtonItem = nil;  
}

-(void)leaveEditMode {  
 [self.textView resignFirstResponder];  
}

(2)如果你的textview裏不用回車鍵,可以把回車鍵當做退出鍵盤的響應鍵。
代碼如下:
#pragma mark - UITextView Delegate Methods   
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
 replacementText:(NSString *)text  
{  
    if ([text isEqualToString:@"\n"]) {  
        [textView resignFirstResponder];  
        return NO;
    }  
    return YES;
}
這樣無論你是使用電腦鍵盤上的回車鍵還是使用彈出鍵盤裏的return鍵都可以達到退出鍵盤的效果。

(3)還有你也可以自定義其他加載鍵盤上面用來退出,比如在彈出的鍵盤上面加一個view來放置退出鍵盤的Done按鈕。

代碼如下:

UIToolbar * topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];  
    [topView setBarStyle:UIBarStyleBlack];  
    UIBarButtonItem * helloButton = [[UIBarButtonItem alloc]initWithTitle:@"Hello" style:UIBarButtonItemStyleBordered target:self action:nil];        
    UIBarButtonItem * btnSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];  
    UIBarButtonItem * doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(dismissKeyBoard)];  
    NSArray * buttonsArray = [NSArray arrayWithObjects:helloButton,btnSpace,doneButton,nil];  
    [doneButton release];  
    [btnSpace release];  
    [helloButton release];  
    [topView setItems:buttonsArray];
    [tvTextView setInputAccessoryView:topView];
  
-(IBAction)dismissKeyBoard  
{
      [tvTextView resignFirstResponder];
}

4)設置UITextView圓角問題

做法是在 #import QuartzCore/QuartzCore.h 後, 來把 UITextView 設定圓角

[textView.layer setCornerRadius:10];

(5)UITextView根據文本大小自適應高度

通過實現文本字數來確定高度,如下:

NSString * desc = @"Description it is  a test font, and don't become angry for which i use to do here.Now here is a very nice party from american or not!";  
CGSize  size = [desc sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(240, 2000) lineBreakMode:UILineBreakModeWordWrap];
然後需要定義UITextView的numberoflines爲0,即不做行數的限制。如下:

[textView setNumberOfLines:0];  
[textView setFrame:CGRectMake(40, 135, 240, size.height+10)];  
[textView setText:desc];

(6)UITextView自定選擇文字後的菜單 在ViewDidLoad中加入:

UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@"分享到新浪微博" action:@selector(changeColor:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObject:menuItem]];
[menuItem release];

當然上面那個@selector裏面的changeColor方法還是自己寫吧,也就是說點擊了我們自定義的菜單項後會觸發的方法。

然後還得在代碼里加上一個方法:

-(BOOL)canPerformAction:(SEL)action
 withSender:(id)sender{
if(action == @selector(changeColor:)){
    if(textView.selectedRange.length>0)
        return YES;
}
    return NO;
}


發佈了59 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章