PinEntry 是一个小型库,为 4 位数字密码输入提供支持。
自定义 UIView,实现了具有支持底部左角额外按钮的 iOS 数字键盘的外观和感受。
放置视图时,最佳框架是 CGRectMake(0, 244, 320, 216)
。这是使用 [[PENumpadView alloc] init];
获取的框架。
使用属性 detailButton 来指定可选按钮的外观。
@property (nonatomic, readwrite, assign) NSUInteger detailButon
要处理按键,您需要实现 PENumpadViewDelegate
。
- (void)keyboardViewDidEnteredNumber:(int)num
当按下数字键时,消息会被发送,num
包含 0..9 范围内的值。
- (void)keyboardViewDidBackspaced
当按下退格键时,消息会被发送。
- (void)keyboardViewDidOptKey
当 detailButon 不是 PEKeyboardDetailNone 时,会发送消息,并且按下左下角按钮。
如果您定义了 PINENTRY_KEYBOARD_SENDS_NOTIFICATIONS,则每个点击都会生成一个 kPinEntryKeyboardEvent 通知,其中 object
是 PENumpadView
,detailInfo
包含键 kPinEntryKeyboardCode 和 NSNumber 值。0..9 对应于数字键,-1 – 左下角按钮,-2 – 退格键。
实现密码输入的视图控制器。您可以用它作为模态控制器或将其推入导航堆栈中。
您可以使用 prompt 属性设置提示文字。
@property (nonatomic, readwrite, copy) NSString *prompt
提示文字会显示在密码框上方。
一旦用户输入 4 位数字并点击 "完成",PEViewController 就会将 pinEntryControllerDidEnteredPin:
消息发送到其 delegate
。
- (void)pinEntryControllerDidEnteredPin:(PEViewController *)controller
然后您可以访问 pin
属性,它持有密码代码的字符串表示形式。以下是密码处理的示例实现。
- (void)pinEntryControllerDidEnteredPin:(PEViewController *)controller
{
if([controller.pin intValue] == 1234) {
// ...
}
}
您可以使用resetPin
方法清除当前密码,使您的PEViewController实例可重用。
完整的导航堆栈实现,需要请求用户输入密码、更新密码或创建新密码。
- (void)verifyPin
{
PEPinEntryController *c = [PEPinEntryController pinVerifyController];
c.pinDelegate = self;
[self presentModalViewController:c animated:YES];
}
- (BOOL)pinEntryController:(PEPinEntryController *)c shouldAcceptPin:(NSUInteger)pin
{
// Verify the pin, return NO if it's incorrect. Otherwise hide the controller and return YES
if(pin == mypin) {
NSLog(@"Pin is valid!");
return YES;
} else {
NSLog(@"Pin is not valid (use %d)!", mypin);
return NO;
}
}
- (void)setPin
{
PEPinEntryController *c = [PEPinEntryController pinCreateController];
c.pinDelegate = self;
[self presentModalViewController:c animated:YES];
}
- (void)pinEntryController:(PEPinEntryController *)c changedPin:(NSUInteger)pin
{
// Update your info to new pin code
NSLog(@"New pin is set to %d", pin);
[self dismissModalViewControllerAnimated:YES];
}
- (void)chagePin
{
PEPinEntryController *c = [PEPinEntryController pinChangeController];
c.pinDelegate = self;
[self presentModalViewController:c animated:YES];
}
- (BOOL)pinEntryController:(PEPinEntryController *)c shouldAcceptPin:(NSUInteger)pin
{
// Verify the pin, return NO if it's incorrect
if(pin == mypin) {
NSLog(@"Pin is valid!");
// Do NOT not hide pinChangeController yet
return YES;
} else {
NSLog(@"Pin is not valid (use %d)!", mypin);
return NO;
}
}
- (void)pinEntryController:(PEPinEntryController *)c changedPin:(NSUInteger)pin
{
// Update your info to new pin code
NSLog(@"New pin is set to %d", pin);
[self dismissModalViewControllerAnimated:YES];
}
- (void)pinEntryControllerDidCancel:(PEPinEntryController *)c
{
NSLog(@"Pin change cancelled!");
[self dismissModalViewControllerAnimated:YES];
}