iOS textfield 限制只能輸入中文

2021-10-08 09:48:00 字數 3082 閱讀 6411

網上搜到的大都是同一種方法,但是這種方法在全鍵的情況下可以,在九鍵的情況下是存在問題的,弄得頭疼,後來才發現,九鍵輸入的字元是需要特殊處理的

而且光處理九鍵還是會有問題,乾脆自己寫吧

.**件

#import

@inte***ce chinesenotificationhelp : nsobject

+ (instancetype)chinesenotificationhelpsharewithtextfiled:(uitextfield *)textfiled;

@end

.m檔案

#import "chinesenotificationhelp.h"

@inte***ce chinesenotificationhelp ()

@property (nonatomic,strong)uitextfield *textfiled;

@property (nonatomic,strong)nsstring *beforestring;

@end

@implementation chinesenotificationhelp

+ (instancetype)chinesenotificationhelpsharewithtextfiled:(uitextfield *)textfiled{

static chinesenotificationhelp *share = nil;

static dispatch_once_t oncetoken;

dispatch_once(&oncetoken, ^{

share = [[chinesenotificationhelp alloc] init];

share.textfiled = textfiled;

return share;

- (instancetype)init{

self = [super init];

if (self) {

[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(textfilededitchanged)

name:@"uitextfieldtextdidchangenotification"

object:nil];

return self;

- (void)dealloc{

[[nsnotificationcenter defaultcenter] removeobserver:self name:@"uitextfieldtextdidchangenotification" object:nil];

-(void)textfilededitchanged{

[self textfiledtextchange:self.textfiled];

- (void)textfiledtextchange:(uitextfield *)textfield{

nsstring *string = textfield.text;

nslog(@"1.=%@",textfield.text);

nsarray *currentar = [uitextinputmode activeinputmodes];// 鍵盤輸入模式

uitextinputmode *current = [currentar firstobject];

nsstring *lang = current.primarylanguage;

if(![lang isequaltostring:@"zh-hans"]) return;

uitextrange *selectedrange = [textfield markedtextrange];

//獲取高亮部分

uitextposition *position = [textfield positionfromposition:selectedrange.start offset:0];

if(position) return;// 有高亮則不處理

// 過濾非漢字

nsmutablestring *chinese = string.mutablecopy;

for (int i = 0; iint a = [string characteratindex:i];

if (a > 0x4e00 && a < 0x9fff) continue;

[chinese replacecharactersinrange:nsmakerange(i,1) withstring:@" "];

// 除去所有空格

textfield.text = [self removespaceandnewline:chinese];

nslog(@"2.=%@",textfield.text);

if(self.beforestring && self.beforestring.length > textfield.text.length && [chinese containsstring:@" "]){

//英文切換過程中處理出現刪減的bug

textfield.text = self.beforestring;

return;

self.beforestring = textfield.text;

// 刪除kon

- (nsstring *)removespaceandnewline:(nsstring *)str

nsstring *temp = [str stringbyreplacingoccurrencesofstring:@" " withstring:@""];

temp = [temp stringbyreplacingoccurrencesofstring:@"\r" withstring:@""];

temp = [temp stringbyreplacingoccurrencesofstring:@"\n" withstring:@""];

return temp;

@end

在需要做限制的textfield中一句**即可

[chinesenotificationhelp chinesenotificationhelpsharewithtextfiled:textfield];

IOS textField限制位元組長度

oc語言中,nsstring型別的字串,視英文本母和程式設計客棧漢字都為乙個長度 string.length把乙個漢字也當做乙個長度 而實際上,乙個英文本母只占用1個位元組,乙個漢字占用2個位元組。有時又有需求,需要限定位元組數目,而不是內容個數,就需要通過一些方法獲取到字串的位元組數。比如,限定1...

如何限制乙個類物件只在堆上分配或者只在棧上分配?

1.第一種說法 只在棧上 class stackonly 只在堆上 class heaponly heaponly 前者利用了c 的過載機制 訪問控制機制。後者利用了c 的訪問控制機制。前者過載了new運算子,並設為私有,因此,當用 new stackonly 時編譯器就會報錯。後者則將建構函式設為...

限制CEdit 只輸入小數的兩種方法

兩種方法均來自網際網路,僅為了收錄 方法一 新建乙個類並且繼承類 cedit 重寫訊息 wm char 新增 void cdoubleedit onchar uint nchar,uint nrepcnt,uint nflags if length pos 2 pos 1 nchar 46 pos ...