访问UIStackView子视图(数组)中的UIViewController组件



首先,这是我第一次在Stack Overflow中发布问题。

所以。。。

目前,我有一个自定义文本字段,我在单独的笔尖文件上创建,称为FormTextField:

class FormTextField: UIViewController {
@IBOutlet weak var labelTitle: UILabel!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
labelTitle.textColor = UIColor.red
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

然后,在主布局中,我有一个UIStackView,我根据乘客数量加载FormTextField:

for view in stackViewOrdering.arrangedSubviews {
stackViewOrdering.removeArrangedSubview(view)
view.removeFromSuperview()
}
name.removeAll()
for ordering in 1...(data.qty ?? 0) {
let item = FormTextField(nibName: "FormTextField", bundle: nil)
_ = item.view
item.labelTitle.text = "Passenger Name (ordering.toString())"
item.textField.placeholder = "Put your name"
item.textField.tag = ordering
item.textField.addTarget(self, action: #selector(onTextChanged(_:)), for: .editingChanged)
name.append("")
stackViewOrdering.addArrangedSubview(item.view)
}

@objc func onTextChanged(_ textField: UITextField) {
name[textField.tag - 1] = textField.text ?? ""
validate()
}

然后,我有一个想法,当用户单击它时制作一个按钮。第一个表单文本字段将自动由他/她的名字填充。我尝试创建此代码,但它不起作用:

if let iv = stackViewOrdering.arrangedSubviews[0] as? FormTextField {
iv.textField.text = active ? (user.fullName ?? "") : ""
name[0] = active ? (user.fullName ?? "") : ""
validate()
}

有一个警告说:"从'UIView'转换不相关的类型'FormTextField'总是失败">

我尝试将 FormTextField 类型更改为 UIView,但它仍然不起作用,当用户填写或未填写文本字段时,我可以处理验证。

提前感谢!

首先,欢迎来到 SO。

您的实现存在多个问题。

1.你的FormTextField它是UIViewController的子类,你没有正确使用它。您正在使用FormTextField的视图,但未将实际FormTextField作为子视图控制器添加到任何UIVIewController。将UIViewController添加为子项的正确方法是这样的:

var controller: FormTextField = // do the nib load here
controller.willMoveToParentViewController(self)
stackViewOrdering.addSubview(controller.view)
self.addChildViewController(controller)
controller.didMoveToParentViewController(self)

2.当您尝试验证您正在尝试将UIView转换为FormTextField时,请记住,您的stackViewOrdering包含UIView的实例,而不是FormTextField,因为您确实stackViewOrdering.addSubview(controller.view)

现在我已经向您展示了这些问题,您可以通过多种方式修复它们:

1.如果你想将FormTextField保留为UIViewController的子类,那么你应该做这样的事情:

if let controller = self.children[0] as? ```FormTextField``` {
controller.textField // do whatever you want here.
}

2.在我看来,最好的方法是将FormTextField更改为UIView的子类而不是UIViewController。为此,您必须更改从 nib 加载视图的方式(互联网上有很多关于如何做到这一点的示例(。如果这样做,您的代码将按原样工作,唯一需要更改的行是:

let item = FormTextField(nibName: "FormTextField", bundle: nil)

最新更新