【问题标题】:UITextVIew secureTextEntry not workingUITextVIew secureTextEntry 不工作
【发布时间】:2017-01-03 09:58:21
【问题描述】:

可能重复Here & here(但他们没有解决我的问题)

我正在创建一个聊天 UI,其中我的文本框必须同时具有 多行 功能和 安全文本输入 功能。

UITextField 没有多行特征

UITextView 没有安全文本输入功能

我现在该怎么办?

另一个疑问,如果 UITextView 的 secureTextEntry 不起作用,为什么他们把该属性放在 UITextView 类中

【问题讨论】:

  • 我正在创建一个聊天应用程序。我希望它应该有多行选项(就像在whatsapp中一样)。在某些情况下,我可能还需要安全文本输入选项。
  • 然后使用UITextView,每当用户启动安全文本时,然后在UI上显示*而不是原始字符,并在后端正确保存您的每个字符,这是我认为唯一可行的方法。
  • 普通文本默认使用UITextView。如果用户想要输入一些安全文本,则必须有类似复选框的东西表示他想要输入安全文本。如果他选择了,请将您的 UITextView 替换为 UITextField
  • @Prera​​kSola 你不能像这样替换组件,更多细节请尝试演示并感受user interface

标签: ios objective-c uitextfield uitextview


【解决方案1】:

只有 UITextField 支持secureTextEntry,制作一个完全由星号组成的字体,并在您选择安全选项后在文本视图中使用它。还要确保禁用复制。

View this link for better understanding

【讨论】:

  • 你不能像这样替换组件
  • @Ganesh 它会被苹果拒绝吗?你能更新我吗?谢谢
  • 好主意,但我不知道如何制作字体。有没有可以下载这种字体的链接?
  • 我认为你需要创建新字体,
【解决方案2】:

您可以使用 hack。您可以使用UITextView 的预定义delegate 方法,即textViewDidChange 因此,请维护一个标志,该标志将保持您是否想要安全进入的状态。 例如,

NSString *originalText = @"";
BOOL isSecuredEntryOn = false;

只要您想添加像BOOL isSecuredEntryOn = true; 这样的安全文本,请将其更改为true

现在这将是您的 delegate 方法的代码:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    originalText = [originalText stringByAppendingString:text];
    return YES;
}

- (void)textViewDidChange:(UITextView *)textView {
    NSString *enteredText = textView.text;
    textView.text = (isSecuredEntryOn) ? [enteredText stringByReplacingOccurrencesOfString:enteredText withString:[self getSecuredTextFor:enteredText]] : enteredText;
}

-(NSString *)getSecuredTextFor:(NSString *)stringToConvert {
    NSString *securedString = @"";
    for (int i = 0; i < stringToConvert.length; i++) {
        securedString = [securedString stringByAppendingString:@"*"];
    }
    return securedString;
}

对于安全文本,您可以使用任何东西来代替 *。

【讨论】:

  • 但是我在哪里可以获得输入的原始文本?当 textViewChange 第二次调用时,我的原始文本将被星号替换。因此我只能得到 astriks
  • 我编辑了答案。您可以使用一个变量来保存原始输入的文本并将其用于进一步的操作。
  • 说我是否要输入“1234”。当我输入“1”时,originalText 将保持“1”。当我输入 '2' 时, originalText 将有 ' *2 ' 。因此,如果我每次都从 textView.text 中获取原始文本,我将无法保留它。
  • No 不,当你输入 1 时,原始文本将是 @"1" as textView.text = @"1"。现在如果你输入 2,原文会变成@"12" as textView.text = @"12"
  • 不,当您键入第二个字符时,第一个字符会变为 astrik。所以,如果你从 textView.text 获取,它只会返回 astrik
【解决方案3】:

我通过子类化 UITextView 并为其添加一些类似于 Pushkraj 添加的属性来使其工作。它在许多情况下都能完美运行(……至少在撰写本文时)。

我的全部答案是here

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2019-07-08
    • 2013-10-24
    • 2018-01-22
    相关资源
    最近更新 更多