2016-09-27 39 views
0

有什麼方法可以將複製的文本/字符串過濾到UITextField? 我已經嘗試使用UITextField方法shouldChangeCharactersInRange,但它只在我們輸入時進行過濾,但是當我們粘貼到它時,仍然無法過濾。我希望UITextField只能通過字母數字輸入,但它仍然可以通過複製粘貼通過其他字符輸入。如何過濾複製粘貼字符串目標c

這裏有一塊我的代碼

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
if (textField == _nameField) { 
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NAME_CHARACTERS] invertedSet]; 
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 
return [string isEqualToString:filtered]; 
} 

在此先感謝。

回答

0

shouldChangeCharactersInRange即使在用戶粘貼到現場時也會被調用。

如果你努力做你需要的功能裏面是什麼,一個簡單的黑客是要做到這一點:

- (BOOL)textField:(UITextField *)shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self textFieldDidUpdate:textField]; 
    }); 

    return YES; 
} 

- (void)textFieldDidUpdate:(UITextField *)textField { 
    // Filter and reset your textfield content 
} 

這是不理想,但它能夠完成任務。

+0

我收到錯誤'功能太少的參數調用' – Pareho

+0

對不起,太多的括號。我編輯了'dispatch_after'片段。 – norders

0

也許這會幫助你。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; 
    BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 
    return valid; 
} 

要獲得唯一的字母數字串,你可以使用這個

NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 
NSLog(@"%@",[[string componentsSeparatedByCharactersInSet: unwantedCharacters] componentsJoinedByString: @""]); 

但是那麼你就必須做一些操作自己在外地。

+0

'stringByTrimmingCharactersInSet'只修剪字符串每一端的字符。 – norders

+0

只要兩端的字符都是字母數字,它就會修剪。如果它們都是字母數字,則結果字符串是@「」。例如,如果它修剪「asdf-ret-tr」,這將返回不是「」的「-ret-」。 –

+0

當然,但如果字符串是「%d&ghj *」,它將返回NO,因此根本不會更新該字段。要求是_filter_非字母數字,即返回YES,但只更新爲「dghj」。 – norders