快速循环通过 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 && 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 自动滚动