8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么我无法删除作为子视图添加的安全 UITextField 以防止在我的自定义 UIView 扩展中屏幕截图?

András Zoller 1月前

22 0

我正在 Swift 中开发自定义 UIView 扩展,该扩展添加了一个带有 isSecureTextEntry = true 的 UITextField 作为子视图以防止屏幕截图。UITextField 已成功添加,我可以配置...

我正在 Swift 中开发一个自定义 UIView 扩展,它添加了一个带有 isSecureTextEntry = true 的 UITextField 作为子视图以防止屏幕截图。UITextField 已成功添加,我可以通过调试打印确认这一点。但是,当我尝试使用同一扩展中的方法删除此 UITextField 时,始终找不到 UITextField,因此它永远不会被删除。我的调试打印确认负责删除的方法从未进入应该找到并删除 UITextField 的条件。

我再次检查了 UITextField 是否分配了正确的标签,并且视图层次结构似乎正确。尽管如此,viewWithTag 方法在尝试删除 UITextField 时似乎找不到它。

以下是该代码的简化版本:

extension UIView {

private struct Constants {
    static var secureTextFieldTag: Int { 54321 }
}

func setScreenCaptureProtection() {
    if viewWithTag(Constants.secureTextFieldTag) is UITextField {
        return
    }
    
    guard superview != nil else {
        for subview in subviews {
            subview.setScreenCaptureProtection()
        }
        return
    }
    
    let secureTextField = UITextField()
    secureTextField.backgroundColor = .clear
    secureTextField.translatesAutoresizingMaskIntoConstraints = false
    secureTextField.tag = Constants.secureTextFieldTag
    secureTextField.isSecureTextEntry = true
    insertSubview(secureTextField, at: 0)
    secureTextField.isUserInteractionEnabled = false
    layer.superlayer?.addSublayer(secureTextField.layer)
    secureTextField.layer.sublayers?.last?.addSublayer(layer)
    secureTextField.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
    secureTextField.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
    secureTextField.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
    secureTextField.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
}

func removeScreenCaptureProtection() {
    if let secureTextField = viewWithTag(Constants.secureTextFieldTag) as? UITextField {
        secureTextField.removeFromSuperview()
    } else {
        for subview in subviews {
            subview.removeScreenCaptureProtection()
        }
    }
}}

感谢您的帮助!。

帖子版权声明 1、本帖标题:为什么我无法删除作为子视图添加的安全 UITextField 以防止在我的自定义 UIView 扩展中屏幕截图?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由András Zoller在本站《swift》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 主要问题是您将所有视图的标签设置为相同,这是错误的...有一个问题,您什么时候会调用 setScreenCaptureProtection?

  • 在 viewWillAppear 中,因为我只需要在某些视图中激活 setScreenCaptureProtection。问题是,如果我删除 \'layer.superlayer?.addSublayer(secureTextField.layer) secureTextField.layer.sublayers?.last?.addSublayer(layer)\',setScreenCaptureProtection 不起作用。

返回
作者最近主题: