【发布时间】:2015-02-06 13:59:57
【问题描述】:
http://sublime.nyasha.me/admin/form_masks.html
我使用这种技术在 html/css/java 等方面取得了不错的效果,但是如何在 Objective-c 中实现呢?
到目前为止,我已经阅读了有关数字格式的内容,但是我如何才能真正拥有它,以便当内容可编辑时,它会在他们键入时显示格式化版本,并且不允许它们在某些区域超过 .length .
我需要用它的例子是
00:00:00 或00h:00m:00s 所以当编辑它会达到__:__:__ 或__h:__m:__s 我一直在互联网上搜索,找不到这样的技术,到目前为止我已经考虑过以编程方式做这样的事情。 .
3x UITextField
1x UILabel
if (editing is commenced && value changed) {
if (.length == 2) {
Move onto next UITextField;
}
}
并在文本字段上显示 UILabel 蒙版,还可以自定义文本字段,使 3 看起来是一个。
-- 编辑
//Programming the Textfield Mask
-(void)reformatAsCardNumber:(UITextField *)textField
{
NSUInteger targetCursorPosition =
[textField offsetFromPosition:textField.beginningOfDocument
toPosition:textField.selectedTextRange.start];
NSString *cardNumberWithoutSpaces =
[self removeNonDigits:textField.text
andPreserveCursorPosition:&targetCursorPosition];
if ([cardNumberWithoutSpaces length] > 6) {
[textField setText:previousTextFieldContent];
textField.selectedTextRange = previousSelection;
return;
}
NSString *cardNumberWithSpaces =
[self insertSpacesEveryFourDigitsIntoString:cardNumberWithoutSpaces
andPreserveCursorPosition:&targetCursorPosition];
textField.text = cardNumberWithSpaces;
UITextPosition *targetPosition =
[textField positionFromPosition:[textField beginningOfDocument]
offset:targetCursorPosition];
[textField setSelectedTextRange:
[textField textRangeFromPosition:targetPosition
toPosition:targetPosition]
];
}
-(BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
previousTextFieldContent = textField.text;
previousSelection = textField.selectedTextRange;
return YES;
}
- (NSString *)removeNonDigits:(NSString *)string
andPreserveCursorPosition:(NSUInteger *)cursorPosition
{
NSUInteger originalCursorPosition = *cursorPosition;
NSMutableString *digitsOnlyString = [NSMutableString new];
for (NSUInteger i=0; i<[string length]; i++) {
unichar characterToAdd = [string characterAtIndex:i];
if (isdigit(characterToAdd)) {
NSString *stringToAdd =
[NSString stringWithCharacters:&characterToAdd
length:1];
[digitsOnlyString appendString:stringToAdd];
}
else {
if (i < originalCursorPosition) {
(*cursorPosition)--;
}
}
}
return digitsOnlyString;
}
- (NSString *)insertSpacesEveryFourDigitsIntoString:(NSString *)string
andPreserveCursorPosition:(NSUInteger *)cursorPosition
{
NSMutableString *stringWithAddedSpaces = [NSMutableString new];
NSUInteger cursorPositionInSpacelessString = *cursorPosition;
for (NSUInteger i=0; i<[string length]; i++) {
if ((i>0) && ((i % 2) == 0)) {
[stringWithAddedSpaces appendString:@":"];
if (i < cursorPositionInSpacelessString) {
(*cursorPosition)++;
}
}
unichar characterToAdd = [string characterAtIndex:i];
NSString *stringToAdd =
[NSString stringWithCharacters:&characterToAdd length:1];
[stringWithAddedSpaces appendString:stringToAdd];
}
return stringWithAddedSpaces;
}
然后调用它
[_answerTextField addTarget:self
action:@selector(reformatAsCardNumber:)
forControlEvents:UIControlEventEditingChanged];
我需要预先确定的文本,例如 __:__:__ 或最好是 __h:__m:__s,因此当您开始输入时,您会在填写时得到 00h:0_m:__。
现在,我得到 `` 然后当我开始输入时,我得到 00:0 等。
【问题讨论】: