快速循环通过 uitextfield 类时无法获得带有标签的正确文本字段?

Posted

技术标签:

【中文标题】快速循环通过 uitextfield 类时无法获得带有标签的正确文本字段?【英文标题】:unable to get proper textfield with tag while looping through uitextfield class in swift? 【发布时间】:2018-07-10 06:55:22 【问题描述】:
 for subviews in self.profilescroll.subviews
    
        if ((subviews is UITextField) && (subviews.tag == 0))
        


            let btntext : UITextField = subviews as! UITextField
            btntext.resignFirstResponder()

        

        if ((subviews is UITextField) && (subviews.tag == 1))
        
            let btntext : UITextField = subviews as! UITextField
            btntext.resignFirstResponder()
        
    

这是我在文本字段中添加标签的地方。

 for i in 0 ..< 2
                    
                        btnbudget = UITextField()
                        btnbudget.frame = CGRect(x: (CGFloat(i) * (((screenWidth - 160)/2) + 40)) + 40, y: 0, width: (screenWidth - 160)/2, height: 50)
                        btnbudget.font = UIFont(name: "Metropolis-SemiBold", size: 18)
                        btnbudget.layer.cornerRadius = 10.0
                        btnbudget.layer.borderWidth = 1.0
                        btnbudget.layer.borderColor = UIColor(hexString:"4B45A0").cgColor
                        btnbudget.tag = i
                        btnbudget.backgroundColor = UIColor(hexString: "#00000000")
                        btnbudget.text = budgetlist.object(at: i) as? String
                        btnbudget.textColor = UIColor(hexString:"4B45A0")
                        btnbudget.textAlignment = .center
                        btnbudget.delegate = self
                        budgetbtnview.addSubview(btnbudget)

profilescroll 是带有 3 个文本字段的视图,我需要在其中找到标签值范围为 0 到 1 的文本字段。但由于某种原因,我没有找到正确的,因此键盘没有返回。

【问题讨论】:

你能显示你为文本字段设置标签的代码吗? 文本字段是profileScroll 的直接子级吗? profileScroll 是带有内容视图的 UIScrollView 吗? 每个组件默认为零。您是否在文本字段的任何地方明确设置了标签?您在哪里将此budgetbtnview 添加到滚动视图 代码已编辑是的,我已明确设置标签 不鼓励您明确设置零标签,因为这是默认设置。从 10 或 100 开始。这就是 Swift:您可以省略 if 条件周围的所有括号:if subviews is UITextField &amp;&amp; subviews.tag == 0 ... 是非常有效的语法。而实际 single 元素的复数形式 subviews 有点令人困惑。 【参考方案1】:

您已经为文本字段分配了标签号,而不需要遍历所有子视图。

  textField.tag = 101

您可以直接使用标签号来获取如下视图...

if let txtField = self.view.viewWithTag(101) as? UITextField 
    print(txtField.text)


确保您提供给视图的所有标签都应该是唯一的,否则您可能会得到不需要的视图。

【讨论】:

当我尝试使用标签 1 的相同文本字段但标签 0 无效时 @vishnu 标签 0 是所有视图的默认标签,请使用 0 以外的标签【参考方案2】:

给定的标签应该是唯一的...试试这个..

 for i in 100 ..< 102

btnbudget = UITextField()
btnbudget.frame = CGRect(x: (CGFloat(i) * (((screenWidth - 160)/2) + 40)) + 40, y: 0, width: (screenWidth - 160)/2, height: 50)
btnbudget.font = UIFont(name: "Metropolis-SemiBold", size: 18)
btnbudget.layer.cornerRadius = 10.0
btnbudget.layer.borderWidth = 1.0
btnbudget.layer.borderColor = UIColor(hexString:"4B45A0").cgColor
btnbudget.tag = i
btnbudget.backgroundColor = UIColor(hexString: "#00000000")
btnbudget.text = budgetlist.object(at: i) as? String
btnbudget.textColor = UIColor(hexString:"4B45A0")
btnbudget.textAlignment = .center
btnbudget.delegate = self
budgetbtnview.addSubview(btnbudget)

和....

for subviews in self.profilescroll.subviews

if ((subviews is UITextField) && (subviews.tag == 100))



let btntext : UITextField = subviews as! UITextField
btntext.resignFirstResponder()



if ((subviews is UITextField) && (subviews.tag == 101))

let btntext : UITextField = subviews as! UITextField
btntext.resignFirstResponder()


但是 self.view.viewWithTag(101) 方法比这个更合适

【讨论】:

【参考方案3】:

假设您有三个UITextField,并且您已将tags 设置为0,1,2

现在,您可以简单地循环遍历您的 profilescroll 中的所有 Subview

for case let textField as UITextField in self.profilescroll.subviews 
    if textField.tag == 0 
        // do something
        return
    
    else if textfield.tag == 1 
      // do something 
      return
    
    else if textfield.tag == 2 
    // do something 
    return
    

这也会忽略subview 不是UITextField 的情况,从而节省时间。

【讨论】:

以上是关于快速循环通过 uitextfield 类时无法获得带有标签的正确文本字段?的主要内容,如果未能解决你的问题,请参考以下文章

通过循环遍历 UITextField 中的值模式来测试应用程序

通过 UiscrollView 快速滚动到 UITextField 仅作为第一次错误

SwiftUI:如何在 UIViewRepresentable UITextField 上调用 becomeFirstResponder 时修复“通过属性检测到的 AttributeGraph 循环”

iOS:当 UITextField 获得焦点时,show segue 阻止 UITableViewController 自动滚动

让按钮快速将文本添加到 UITextField

快速禁用 UITextfield 的用户输入