2012-05-14 29 views
0

我創建了一個自定義的UITextField,用於比較用戶輸入和數據庫記錄。一切都很好,直到用戶在我已經建議了一些東西之後在文本字段中放置一個空格。它崩潰以下消息的應用程序:自動完成UITextField崩潰應用程序

終止應用程序由於未捕獲的異常「NSRangeException」,原因:「* - [__ NSCFConstantString substringToIndex:]:範圍或索引超出範圍」

這裏是代碼:

NSRange cursorRange = [[self valueForKey:@"selectionRange"] rangeValue]; 
NSString *entered = [self.text substringToIndex:cursorRange.location]; 
if (![self.text isEqualToString:entered]) { 
    self.text = entered; 
    return; 
} 

NSString *suggestedSuffix; 
for (NSString *name in filterData) { 
    if (name.length > cursorRange.location && [[name lowercaseString] hasPrefix:entered]) { 
     suggestedSuffix = [name substringFromIndex:cursorRange.location]; 
     NSMutableString *suggestedString = [[NSMutableString alloc] initWithString:entered]; 
     [suggestedString appendString:suggestedSuffix]; 
     self.text = suggestedString; 
     [self setValue:[NSValue valueWithRange:cursorRange] forKey:@"selectionRange"]; 
     return; 
    } 
} 

}

+0

我會建議在檢索您的NSRange並輸出當前值以確定它返回的原因以及它爲什麼在文本字段中的文本邊界之外添加一個NSLog .. – pdriegen

+0

哪條線拋出錯誤?您輸入的每個字符都會顯示您所顯示的代碼嗎? – strings42

+0

代碼由控件事件UIControlEventEditingChanged觸發。所以,每個輸入的字符都會再次調用它。 – Fortytwo

回答

0

我想知道你是否有你的鑰匙是否正確?

UITextField沒有selectionRange屬性公開定義的AFAICT。但是,<UITextInput> - 其中UITextField符合 - 具有selectedTextRange屬性。這可能是你的意圖嗎? (這是可能有實際調用selectionRange您意外遇到了一個未公開的私人財產,並如預期的情況下,如你遇到的不行爲)。

另外,你真的是UITextView - 其中有一個selectedRange - 但仍然沒有selectionRange

另外,我不認爲子類UITextField是正確的方法。使用<UITextFieldDelegate>方法可以完全(無雙關語)實現自動完成,並且它是Cocoa編程的一個準則,當您可以通過類組合而不是子類實現目標時,您應該每次都選擇合成。

+0

好吧,我正在考慮使用重新考慮,所以我只是從那裏開始。感謝您的意見。 – Fortytwo