2011-09-16 73 views
0

我有一個文本字段。如何停止Objective C中的函數遞歸?

下面的函數附加到來自txtfield的IB的「編輯已更改」的UI事件。

功能是遞歸的那麼明顯,我改變文本字段,因此將再次調用

,再沒有任何東西,稱這是一次之後,我可以停止功能。

所以,我想停止這種循環功能..

-(IBAction) testEvents:(id) sender 
{ 

    txtEditAmount.text=[txtEditAmount.text substringToIndex:([txtEditAmount.text length]-1)]; 




} 

回答

2

而不是使用事件回調,嘗試實現UITextFieldDelegate方法textFieldDidEndEditing:,像這樣:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    textField.text = [textField.text substringToIndex: 
         [txtEditAmount.text length] - 1]; 
} 

所以它只會在切斷的最後一個字符用戶停止編輯該字段。取決於你想要做什麼,我想。如果你想退格無論他們的類型,例如,它可以停留空白,但仍然是一個密碼字段捕捉人物的用戶類型,而不是實現協議方法textField:shouldChangeCharactersInRange:replacementString:這樣的:

- (BOOL)textField:(UITextField *)textField 
    shouldChangeCharactersInRange:(NSRange)range 
    replacementString:(NSString *)string 
{ 
    [enteredString appendString:string]; // store the character the user typed 
    return NO; // leave the field blank 
} 
+0

這絕對是一個很好的方式來使用這種方法,並簡化我的工作真的很感謝...... –

1

你可以使用一個靜態布爾值。

-(IBAction) testEvents:(id) sender 
{ 
    static BOOL programmaticallyChanged=NO; 
    if(programmaticallyChanged) { 
     return; 
    } 
    programmaticallyChanged=YES; 
    txtEditAmount.text=[txtEditAmount.text substringToIndex:([txtEditAmount.text length]-1)]; 
    programmaticallyChanged=NO; 
} 
+0

在'programmaticallyChanged = YES;'和'programmaticallyChanged = NO;'之間是否會調用'testEvents:'? – Nekto

+0

@Nekto:這就是問題所暗示的。 – icktoofay

+0

是的,當然,我不確定那個'testEvents:'會在這個分配之間被調用。如果它會 - 那麼偉大的解決方案 – Nekto

2

我的變種

-(IBAction) testEvents:(id) sender 
{ 
    static BOOL flag = NO; 
    if (flag) {flag=NO; return;} 
    flag = YES; 
    txtEditAmount.text=[txtEditAmount.text substringToIndex:([txtEditAmount.text length]-1)]; 
} 
+0

我已經嘗試過,它工作很好,但我找到了一個很好的方式匹配我的要求,謝謝... –

1

實現此方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    return YES;//it will allow edit to you if NO it will not allow to you 
//return NO;when don,t want call that 
}