【问题标题】:Button is not removing the textField & itself from super view in swift iOS按钮不会从 swift iOS 中的超级视图中删除 textField & 本身
【发布时间】:2018-06-19 07:19:21
【问题描述】:

在我看来,我正在生成一个textField 和一个卸妆器Button,用于生成两者@ 但问题是当我生成多个 textFields 和按钮时,当我单击 textDest 的卸妆按钮时,它只删除最后一个 textField 和添加到视图中的按钮,其余的 textDest 不起作用他们没有删除 textField和按钮。

这是其他移除器按钮无法移除 textField 及其本身的按钮。

这里是代码

@objc func pressedTextAction(_ sender: UITextField) {
    self.textFieldElement = "textField1"

    self.updateScrollY()

    textFieldTag += 1
    textDestTag += 1
    uniY += 60
    //let textY = self.uniY + 20

    self.sampleTextField =  UITextField(frame: CGRect(x: self.xValue, y: uniY, width: 200, height: 30))
    self.sampleTextField.placeholder = "Enter placeholder"
    self.sampleTextField.font = UIFont.systemFont(ofSize: 15)
    self.sampleTextField.borderStyle = UITextBorderStyle.roundedRect
    self.sampleTextField.autocorrectionType = UITextAutocorrectionType.no
    self.sampleTextField.keyboardType = UIKeyboardType.default
    self.sampleTextField.returnKeyType = UIReturnKeyType.done
    self.sampleTextField.clearButtonMode = UITextFieldViewMode.whileEditing;
    self.sampleTextField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
    self.sampleTextField.delegate = self as? UITextFieldDelegate
    self.sampleTextField.tag = self.textFieldTag
    print("\(String(describing: self.sampleTextField.tag))")
    self.view.addSubview(self.getFormView)
    self.getFormView.addSubview(self.sampleTextField)
    let frametext = self.sampleTextField.frame.size.height
    self.textObjects?.append(self.sampleTextField as Any)
    self.yValue = self.yValue + Int(frametext) + 20
    self.xValue = 20
    print("You have text field with tag \(self.sampleTextField.tag)")

    let yOftextDest = uniY
    self.textDest = UIButton(frame: CGRect(x: self.xValue + 220, y: yOftextDest + 5, width: 20, height: 20))
    self.textDest.setImage(#imageLiteral(resourceName: "destroyIcon"), for: .normal)
    self.getFormView.addSubview(textDest)

    self.textDest.addTarget(self, action: #selector(pressedTextDestAction(_:)), for: .touchUpInside)
    self.textDest.tag = self.textDestTag
    print("\(String(describing: self.textDest.tag))")
    self.textDestObjects?.append(self.textDest as Any)
    self.enterPlaceholder()


}



@objc func pressedTextDestAction(_ sender: UIButton) {
    self.updateScrollY()
    self.sampleTextField.viewWithTag(sampleTextField.tag)?.removeFromSuperview()
    self.textDest.viewWithTag(textDest.tag)?.removeFromSuperview()

}

【问题讨论】:

  • 您正试图从它的标签中找到相同的视图,然后将其从超级视图中删除。为什么不使用self.sampleTextField.removeFromSuperview()self.textDest.removeFromSuperview()
  • @Mukesh 我用过这个,但它不起作用它还删除了最后生成的 textField 和它本身的按钮
  • 这些是getFormView 的子视图,所以你应该使用self.getFormView.viewWithTag(sampleTextField.tag)?.removeFromSuperview()self.getFormView.viewWithTag(textDest.tag)?.removeFromSuperview()
  • @Mukesh 收到此错误“UIView”类型的值没有成员“removeFro‌​mSuperview”
  • 我认为问题可能在于使用 += 1 分配标签。尝试对您添加的最后一个标签进行全局引用。 var lastTag: Int = 0,然后在创建按钮时增加此变量。并将这个变量的值赋给创建的字段的标签。

标签: ios swift uibutton uitextfield


【解决方案1】:

我建议使用带有自定义单元格的 UITableView,该单元格具有 textField 和破坏性按钮。这样您就可以轻松添加和删除新的文本字段,而无需显式引用每个文本字段。

在您的pressedTextDestAction 上,您可以从表格和数据源中删除行,并确保删除正确的文本字段。

它可能看起来像这样

var placeholders: [String]

/*...*/

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = YourCustomCell() //dequeued 
     cell.textField.text = placeholders[indexPath.row]
     cell.destructiveButton.tag = indexPath.row
     cell.destructiveButton.addTarget(self, action: #selector(pressedTextDestAction(_:)), for: .touchUpInside)
     return cell
}

现在在你的方法中:

@objc func pressedTextDestAction(_ sender: UIButton) {
     table.removeRows(at: [IndexPath(row: sender.tag, section: 0)], with .fade)
     placeholders.removeAt(sender.tag)
}

我建议您也仔细研究 UITableViews 或 UICollectionViews,因为它们确实可以帮助您管理可重用的项目。此外,这是在 iOS 环境中执行此操作的首选方法。

【讨论】:

  • 有什么方法可以使用 uiviews 而不是 tableview
  • 创建一个自定义 UIView,其中包含您的文本字段和按钮。在创建新文本字段时,改为创建此自定义 UIVIew 并将其添加到您全局存储在 viewController 中的视图数组中。当破坏性按钮被点击时,遍历您的视图数组以找到具有所需标签的视图。从超级视图中删除该 UIView 并将其从数组中删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多