如何在UITableViewController中从静态单元格获取文本字段?Swift

3

我的视图层次结构如下:
ElevethViewController 是 UIViewController 类型
容器视图
ManagedTableEleventhViewController 是 UITableViewController 类型,嵌入在容器视图中

ManagedTableEleventhViewController 包含 4 个静态单元格,每个单元格都包含 1 个 textField 和一个空的静态单元格。

   class ManagedTableEleventhViewController: UITableViewController,UITextFieldDelegate {

  var hasText:Bool! 
  @IBOutlet weak var fullName: UITextField!
  @IBOutlet weak var flatNumber: UITextField!
  @IBOutlet weak var streetAddress: UITextField!
  @IBOutlet weak var phoneNumber: UITextField!

   //checkValue takes ELViewController parameter so that segue can be 
     //performed when button is touched in EleventhViewController


   func checkValue(ELViewController:EleventhViewController) {

     //loop through the textfields and check if they have text
       for case let textField as UITextField in viewController.view.subviews {

      //print is not executed meaning loop is not performed
             print("some text")
         if textField.text == "" {
             self.hasText = false
               textField.layer.borderColor = UIColor.red.cgColor
                 } else {
             print("true value in for loop")
              self.hasText = true

    performSegue(withIdentifier: "elevethToTwelveth", sender: ELViewController)
       }
  }//end of for loop
}





class EleventhViewController: UIViewController {

    var nextButtonOutlet:UIButton!

      override func viewDidLoad() {
            super.viewDidLoad()

//create button programmatically
      var button = UIButton(type: UIButtonType.custom) as UIButton
         button = UIButton(frame: CGRect(x: 0, y: 637, width: 375, height: 50))
          button.titleLabel?.textColor = UIColor.white
          button.backgroundColor = UIColor(colorLiteralRed: 117/255, green: 232/255, blue: 0, alpha: 1)
          button.setTitle("Next", for: .normal)
             button.addTarget(self, action: #selector(EleventhViewController.nextButton), for: .touchUpInside)
         self.view.addSubview(button)
          self.nextButtonOutlet = button
   }


       func nextButton(sender: UIButton) {

      //create instance of tableView
         let managedTable = ManagedTableEleventhViewController()
           managedTable.checkValue(viewController: self)

  } //end of  EleventhViewController class

Main.storyboard


@Magnas 视图控制器是EleventhViewController。我已经按照这个教程 https://www.youtube.com/watch?v=zAWO9rldyUE 创建了视图层次结构。 - bibscy
在您发布的代码中,ManagedTableEleventhViewController类没有任何方法。这只是您的“粘贴”决定还是该类确实没有方法? - Magnas
@Magnas 我想尽量减少粘贴的代码量,以使其更易读。我已经更新了我的代码,加入了编程按钮,每次触摸它都会调用 func nextButton() - bibscy
@Magnas 我误读了你的问题。在ManagedTableEleventhViewControlle中有一个func checkValue(ELViewController:EleventhViewController)方法。现在,每次点击nextButtonOutlet时,都会在EleventhViewController中调用checkValue方法。 - bibscy
我认为问题出在你调用checkValue时传入了EleventhViewController(当你传入self时),它没有textFields。textFields在你的tableViewController中,所以你的循环在EleventhViewController中查找所有的textFields,但是没有找到,因此print语句没有被调用。 - Magnas
显示剩余3条评论
2个回答

3

首先,我可以给你一个可能会满足你并解决循环的答案,但我建议不要以这种方式修改您的文本字段。即使它们是静态单元格,我建议在cellForRow中完成。根据单元格中视图的设置,如果文本字段直接添加到单元格而不是其他视图,则会像这样。

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Testing")
    for cell in tableView.visibleCells{
        for sub in cell.contentView.subviews{
            if sub is UITextField{
                print("Textfield")
            }
        }
    }
}

文本字段从对象库中拖动并放置在tableView的静态单元格中。 - bibscy

1
请跟进,如果这是用于验证的,则不应仅检查“”情况,因为您允许“”,“ ”等。使用isEmpty,它应该工作得更好,如果您只想检查文本的存在。 此外,您不必从子视图中提取字段,因为您已经拥有属性,虽然我不确定您是否有其他原因进行此逻辑。
编辑。糟糕,我刚刚注意到您在控制器中检查文本字段,该控制器没有任何可见字段,因此通常您的检查永远不会通过。
我认为您甚至不应该在另一个类中验证一个类的文本字段,除非它是处理文本字段验证的类。
在EleventhViewController中,您没有文本字段可供验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接