2014-10-20 3 views
0

Я создаю собственное приложение для iPad, работающее на iOS 8 (не для магазина приложений), и одним из требований является пользовательская клавиатура, которая реплицирует клавиатуру ввода номера для разблокировки/PIN-кода iPad ,Custom Pad для iPad App

я на основе моего пользовательского цифровую клавиатуру на этом проекте: https://github.com/lnafziger/Numberpad

В моем проекте я добавил новый UIView к UIViewController, так что я могу повторить точки, которые появляются, когда PIN-код 4-значный набран, как ниже:

Custom Number Pad with PIN text boxes.

Моя проблема заключается в том, что я не могу получить нацеливание числа правильных, когда я нажимаю их. Моя цель состоит в том, что когда я нажимаю цифры от 0 до 9, первый клик будет помещать это число в первое текстовое поле, а второе во второе и т. Д. Но я не могу получить краны на цифровой клавиатуре для регистрации в любом из 4 доступных UITextFields.

[EDIT]

Вот что часть кода до сих пор:

#pragma mark - KEYPAD IBACTIONS 

// A number (0-9) was just pressed on the number pad 
// Note that this would work just as well with letters or any other character and is not limited to numbers. 
- (IBAction)numberpadNumberPressed:(UIButton *)sender { 
    if (self.targetTextInput) { 
     NSString *numberPressed = sender.titleLabel.text; 
     if ([numberPressed length] > 0) { 
      UITextRange *selectedTextRange = self.targetTextInput.selectedTextRange; 
      if (selectedTextRange) { 
       [self textInput:self.targetTextInput replaceTextAtTextRange:selectedTextRange withString:numberPressed]; 
      } 
     } 
    } 
} 

// The delete button was just pressed on the number pad 
- (IBAction)numberpadDeletePressed:(UIButton *)sender { 
    if (self.targetTextInput) { 
     UITextRange *selectedTextRange = self.targetTextInput.selectedTextRange; 
     if (selectedTextRange) { 
      // Calculate the selected text to delete 
      UITextPosition *startPosition = [self.targetTextInput positionFromPosition:selectedTextRange.start offset:-1]; 
      if (!startPosition) { 
       return; 
      } 
      UITextPosition *endPosition = selectedTextRange.end; 
      if (!endPosition) { 
       return; 
      } 
      UITextRange  *rangeToDelete = [self.targetTextInput textRangeFromPosition:startPosition 
                       toPosition:endPosition]; 

      [self textInput:self.targetTextInput replaceTextAtTextRange:rangeToDelete withString:@""]; 
     } 
    } 
} 

// The clear button was just pressed on the number pad 
- (IBAction)numberpadClearPressed:(UIButton *)sender { 
    if (self.targetTextInput) { 
     UITextRange *allTextRange = [self.targetTextInput textRangeFromPosition:self.targetTextInput.beginningOfDocument 
                    toPosition:self.targetTextInput.endOfDocument]; 

     [self textInput:self.targetTextInput replaceTextAtTextRange:allTextRange withString:@""]; 
    } 
} 

// The done button was just pressed on the number pad 
- (IBAction)numberpadDonePressed:(UIButton *)sender { 
    if (self.targetTextInput) { 
     [self.targetTextInput resignFirstResponder]; 
    } 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    return YES; 
} 

- (BOOL)textViewShouldEndEditing:(UITextView *)textView 
{ 
    return YES; 
} 

// Replace the text of the textInput in textRange with string if the delegate approves 
- (void)textInput:(id <UITextInput>)textInput replaceTextAtTextRange:(UITextRange *)textRange withString:(NSString *)string { 
    if (textInput) { 
     if (textRange) { 
      // Calculate the NSRange for the textInput text in the UITextRange textRange: 
      int startPos     = [textInput offsetFromPosition:textInput.beginningOfDocument 
                   toPosition:textRange.start]; 
      int length      = [textInput offsetFromPosition:textRange.start 
                   toPosition:textRange.end]; 
      NSRange selectedRange   = NSMakeRange(startPos, length); 

      if ([self textInput:textInput shouldChangeCharactersInRange:selectedRange withString:string]) { 
       // Make the replacement: 
       [textInput replaceRange:textRange withText:string]; 
      } 
     } 
    } 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *passcode = [textField text]; 
    passcode = [passcode stringByReplacingCharactersInRange:range withString:string]; 

    switch ([passcode length]) { 
     case 0: 
      self.txtBulletField0.text = nil; 
      self.txtBulletField1.text = nil; 
      self.txtBulletField2.text = nil; 
      self.txtBulletField3.text = nil; 
      break; 
     case 1: 
      self.txtBulletField0.text = @"*"; 
      self.txtBulletField1.text = nil; 
      self.txtBulletField2.text = nil; 
      self.txtBulletField3.text = nil; 
      break; 
     case 2: 
      self.txtBulletField0.text = @"*"; 
      self.txtBulletField1.text = @"*"; 
      self.txtBulletField2.text = nil; 
      self.txtBulletField3.text = nil; 
      break; 
     case 3: 
      self.txtBulletField0.text = @"*"; 
      self.txtBulletField1.text = @"*"; 
      self.txtBulletField2.text = @"*"; 
      self.txtBulletField3.text = nil; 
      break; 
     case 4: 
      self.txtBulletField0.text = @"*"; 
      self.txtBulletField1.text = @"*"; 
      self.txtBulletField2.text = @"*"; 
      self.txtBulletField3.text = @"*"; 

      // Notify delegate a little later so we have a chance to show the 4th bullet 
      [self performSelector:@selector(notifyDelegate:) withObject:passcode afterDelay:0]; 

      return NO; 

      break; 
     default: 
      break; 
    } 

В первоначальном проекте число подушечка целевой один UITextField и поставить все количество кранов в там. Теперь я хочу, чтобы он автоматически перемещался между моими 4 UITextFields (один UITextField должен принимать только 1 символ, а затем перейти к следующему UITextField). Метод numberpadNumberPressed, похоже, вообще не вызывает обновление текстовых полей.

[END EDIT]

Как мне это сделать?

+1

Почему бы не просто использовать один 'UITextField' с' secureTextEntry' полем, создаваемым в 'YES'? – quark

+0

@quark вы могли бы расширить то, что вы имеете в виду, потому что я не понимаю? Проблема в том, что мои краны не помещают числа в поля (а также удалять, когда я удаляю). – motionpotion

+0

Можете ли вы показать свой код, что произойдет, когда вы нажмете на номер? Это было бы хорошим местом для начала. –

ответ

2

Это может быть так просто.

Просто сохраните цифры, которые были использованы в один изменяемая строковая переменная. Когда клавиша нажата, добавьте следующий номер. Если нажать клавишу удаления, удалите последний номер, если он есть. Это должно быть легко. Например.

if (pinString.length < 4) { 
    [pinString appendString:sender.titleLabel.text] 
} 

и

if (pinString.length) { 
    [pinString deleteCharactersInRange:NSMakeRange(pinString.length-1,1)]; 
} 

Вы не редактируя числа в текстовых полях, так что вы должны использовать метки вместо этого. В следующем, я полагаю, вы дали им теги 101, 102, 103 и 104.

Тогда просто сделать что-то вроде этого:

for (UILabel *label in theFourTextLabels) { 
    label.text = label.tag - 100 > pinString.length ? "" : "*"; 
} 
+1

Вы должны принять этот ответ, поскольку он затрагивает ваш вопрос о логике. Вопрос, который вы поднимаете в комментарии, - это другая проблема - вы должны задать новый вопрос. (Возможно, вам стоит просто проверить подключение к вашей кнопке.) – Mundi