ios - Subclassing UITextField with self.delegate causes app to freeze, CPU spikes to 100% -
ios - Subclassing UITextField with self.delegate causes app to freeze, CPU spikes to 100% -
i have subclass of uitextfield
sets self.delegate = self
. subclass used prevent special characters beingness entered uitextfield
. @ first works fine, after few keys pressed cpu spikes 100% , freezes app. there no crash log in xcode because app never crashes, stays frozen until stop it. after research, have determined problem setting delegate
self
- apparently should create separate delegate
uitextfield
? have searched online cannot find useful on how this.
my acceptedcharacters subclass:
acceptedcharacters.h #import <uikit/uikit.h> @interface acceptedcharacters : uitextfield <uitextfielddelegate> @end
and
acceptedcharacters.m #import "acceptedcharacters.h" #define acceptable_characters @" abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789_." @implementation acceptedcharacters - (void)awakefromnib { [super awakefromnib]; if (self) { self.delegate = self; } } - (bool)textfield:(uitextfield *)textfield shouldchangecharactersinrange:(nsrange)range replacementstring:(nsstring *)string { //nslog(@"acceptedcharacters"); // restrict special characters nscharacterset *cs = [[nscharacterset charactersetwithcharactersinstring:acceptable_characters] invertedset]; nsstring *filtered = [[string componentsseparatedbycharactersinset:cs] componentsjoinedbystring:@""]; homecoming [string isequaltostring:filtered]; } @end
similar questions have found on stack overflow:
application freezes after editing custom uitextfield
uitextfield delegate jumping 100% cpu usage , crashing upon using keyboard shortcut
why uitextfield lock when setting delegate
i have read through solutions quite vague beginner. appreciate amend code below or point me in direction of tutorial or documentation? in advance.
edit:
i have tested code on 1 of viewcontrollers
, works fine when conforming uitextfielddelegate
protocol , when textfield delegates
set self
(see snippet below).
in viewdidload
method:
self.forenamefield.delegate = self; self.surnamefield.delegate = self; self.addline1field.delegate = self; self.addline2field.delegate = self; self.addline3field.delegate = self; self.addline4field.delegate = self; self.addline5field.delegate = self; self.postcodefield.delegate = self; self.tellandfield.delegate = self; self.telmobfield.delegate = self; self.emailfield.delegate = self; self.dobfield.delegate = self; self.ninumfield.delegate = self;
i rather create several subclasses of uitextfield
, phone call them on specific textfields rather have messy method 1 below.
#define acceptable_characters @" abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789_." #define numbers_only @"1234567890" #define character_limit 11 - (bool)textfield:(uitextfield *)textfield shouldchangecharactersinrange:(nsrange)range replacementstring:(nsstring *)string { // restrict special characters nscharacterset *cs = [[nscharacterset charactersetwithcharactersinstring:acceptable_characters] invertedset]; nsstring *filtered = [[string componentsseparatedbycharactersinset:cs] componentsjoinedbystring:@""]; // convert postcode field characters uppercase if (textfield == self.postcodefield) { [textfield settext:[textfield.text stringbyreplacingcharactersinrange:range withstring:[string uppercasestring]]]; homecoming no; } // set max character limit on tel fields if (textfield == self.telmobfield || textfield == self.tellandfield) { nsuinteger newlength = [textfield.text length] + [string length] - range.length; nscharacterset *cs = [[nscharacterset charactersetwithcharactersinstring:numbers_only] invertedset]; nsstring *filtered = [[string componentsseparatedbycharactersinset:cs] componentsjoinedbystring:@""]; homecoming (([string isequaltostring:filtered])&&(newlength <= character_limit)); } //return yes; homecoming [string isequaltostring:filtered]; }
try instead:
@interface mytextfield : uitextfield - (bool)stringisacceptable:(nsstring *)string inrange:(nsrange)range; @end @implementation mytextfield - (bool)stringisacceptable:(nsstring *)string inrange:(nsrange)range { nscharacterset *cs = [[nscharacterset charactersetwithcharactersinstring:acceptable_characters] invertedset]; nsstring *filtered = [[string componentsseparatedbycharactersinset:cs] componentsjoinedbystring:@""]; homecoming [string isequaltostring:filtered]; } @end @interface postalcodetextfield : mytextfield @end @implementation postalcodetextfield - (bool)stringisacceptable:(nsstring *)string inrange:(nsrange)range { [self settext:[self.text stringbyreplacingcharactersinrange:range withstring:[string uppercasestring]]]; homecoming no; } @end .. more subclasses
then assign view controller delegate , in view controller:
- (bool)textfield:(uitextfield *)textfield shouldchangecharactersinrange:(nsrange)range replacementstring:(nsstring *)string { if ([textfield iskindofclass:[mytextfield class]]) { homecoming [(mytextfield *)textfield stringisacceptable:string inrange:range]; } homecoming yes; }
ios objective-c delegates subclass uitextfielddelegate
Ios - Subclassing Uitextfield With Self.Delegate Causes App To Ze,
ReplyDeleteCpu Spikes To 100% - >>>>> Download Now
>>>>> Download Full
Ios - Subclassing Uitextfield With Self.Delegate Causes App To Ze,
Cpu Spikes To 100% - >>>>> Download LINK
>>>>> Download Now
Ios - Subclassing Uitextfield With Self.Delegate Causes App To Ze,
Cpu Spikes To 100% - >>>>> Download Full
>>>>> Download LINK mG