【问题标题】:iOS Obj-C toggle secure text entry for multiple text fieldsiOS Obj-C 切换多个文本字段的安全文本输入
【发布时间】:2017-10-06 00:06:27
【问题描述】:

这里是 Obj-C 的新手。我有 6 个包含用户 PIN 码的文本字段

如何切换这 6 个 UI 文本字段的安全文本输入?有按钮可以显示和取消显示 PIN 码。默认情况下,在 Storyboard 上检查安全文本条目。

google了一会儿,我发现这段代码是为了在我的视图中找到所有文本字段

- (NSArray*) findAllTextFieldsInView:(UIView*)view {
    NSMutableArray* textfieldarray = [[NSMutableArray alloc] init];
    for (id x in [view subviews]) {
        if ([x isKindOfClass:[UITextField class]])
            [textfieldarray addObject:x];

        if ([x respondsToSelector:@selector(subviews)]) {
            [textfieldarray addObjectsFromArray:[self findAllTextFieldsInView:x]];
        }
    }
    return textfieldarray;
}

这是我的代码

- (IBAction) revealPIN:(id)sender {

    if (self.reveal == TRUE) {
        self.reveal = FALSE;
    }
    else {
        self.reveal = TRUE;
    }

    NSArray* allTextFields = [self findAllTextFieldsInView:[self view]];
}

我不知道把textField.secureTextEntry = YESNO 放在哪里;

我输入了布尔值,以便我可以检查切换状态。这之后我该怎么办?还是有其他更优雅的方式来实现它?我对如何做到这一点感到困惑

谢谢!

【问题讨论】:

  • 您的所有文本字段都通过 StoryBoard 添加了吗?
  • 你用过storyboard还是xib?
  • 我正在使用情节提要来设计文本字段。我也已经为每个文本字段放置了标签 1 - 6。首先我检查安全文本条目,然后我希望用户能够切换它
  • 当您加载视图时,您需要设置所有文本字段“textField.secureTextEntry = YES”。如果用户点击 revelAction ,textField.secureTextEntry = NO。不需要布尔值
  • 你有多少 revelActions ... 表示每个测试字段作为自己的 revelActon 或为所有文本字段创建一个 revelAction

标签: ios objective-c uitextfield


【解决方案1】:

你应该这样尝试:

- (IBAction) revealPIN:(id)sender {

    if (self.reveal == TRUE) {
        self.reveal = FALSE;
    }
    else {
        self.reveal = TRUE;
    }

    NSArray* allTextFields = [self findAllTextFieldsInView:[self view]];

    for tf in allTextFields
    {
       tf.secureTextEntry = self.reveal; // <--- Check this one
    }
}

您也可以优化,而不是先找到文本字段然后更新它们的 secureTextEntry 属性,您应该创建一个直接更新文本字段属性的方法,如下所示:

- (void) updateSecureEntryAttrForAllTextFieldsInView:(UIView*)view {
    NSMutableArray* textfieldarray = [[NSMutableArray alloc] init];
    for (id x in [view subviews]) {
        if ([x isKindOfClass:[UITextField class]])
            x.secureTextEntry = self.reveal;  // <--- Check this one

        if ([x respondsToSelector:@selector(subviews)]) {
            [textfieldarray addObjectsFromArray:[self updateSecureEntryAttrForAllTextFieldsInView:x]];
        }
    }
    return;
}

【讨论】:

  • 这就是我要找的!先生,您是我的救星!
【解决方案2】:

如果您通过故事板或 xib 添加了 textFiled,那么您可以在界面生成器中找到此选项。在情节提要中选择您的文本字段。这里我附上了参考图片。

请为您的所有文本字段勾选安全选项。

当用户点击代码下方位置的“显示”更改文本字段安全选项时。

-(NSArray*)findAllTextFieldsInView:(UIView*)view{
NSMutableArray* textfieldarray = [[NSMutableArray alloc] init];
for(id x in [view subviews]){
    if([x isKindOfClass:[UITextField class]]){
x. secureTextEntry = YES;
        [textfieldarray addObject:x];
}
    if([x respondsToSelector:@selector(subviews)]){
        [textfieldarray addObjectsFromArray:[self findAllTextFieldsInView:x]];
    }
}
return textfieldarray;
} 

【讨论】:

  • 先生,我希望用户能够切换安全文本输入。有“显示”按钮可以显示 PIN 码
  • 为所有文本文件选择此选项。然后,当用户点击“显示”更改设置 textFiled.secure = NO 为特定的 textfiled .
  • 这就是我想要实现的目标。这就是为什么我在这里问先生,我怎样才能获得所有文本字段,然后切换安全文本输入
【解决方案3】:

如果您想让用户显示/隐藏安全条目,您必须在切换方法中使用此代码:

yourTextField.secureTextEntry = YES;
yourTextField.secureTextEntry = NO;

【讨论】:

    【解决方案4】:

    由于您使用的是故事板,我会执行以下操作:

    1. 在情节提要中,您必须有一个场景(视图控制器),其视图包含 6 个文本字段作为子视图。
    2. 通过前往 Identity Inspector 确保将视图控制器的类设置为您的 UIViewController 子类的名称。假设您的课程名为 MyViewController。
    3. 由于您使用的是 Objective-C,请转至 MyViewController.m 由于您需要每个文本字段的出口,它们都是相同的类型,因此最好使用 IBOutletCollection。所以将以下类扩展添加到MyViewController.m

      @interface MyViewController()
      @property (nonatomic) IBOutletCollection(UITextFIeld) NSArray *textFields;
      @end
      
    4. 使用助理编辑器将每个出口添加到集合中,将情节提要放在屏幕左侧,MyViewController.m 放在右侧。控制从情节提要中的每个UITextField 拖动到MyViewController.m 中的textFields 属性。

    5. MyViewController.m的实现中添加如下方法:

      @implementation MyViewController
      - (void)updateTextFieldsWithSecureEntry:(BOOL)secureEntryEnabled {
          for (UITextField *textField in self.textFields) { 
              textField.secureTextEntry = secureEntryEnabled
          }
      }
      @end
      
    6. 您只需致电 [self updateTextFieldsWithSecureEntry: false] 即可关闭所有 6 个文本字段的安全输入。

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多