菜鸟教程小白 发表于 2022-12-11 17:50:46

ios - 单元格不能选择在主视图中嵌入 UItableView?


                                            <p><p>我将 UITableView 嵌入到主 UIView 中。我的问题是当我单击一个单元格以选择项目时,它没有响应选择或触发 segue。 </p>

<p>注意:在属性检查器中
选择应该设置为单选吗?</p>

<p>更新说明:<code>prepareForSegue</code> 函数不会触发或打印“test”。 </p>

<p> <a href="/image/OioLg.png" rel="noreferrer noopener nofollow"><img src="/image/OioLg.png" alt="enter image description here"/></a> </p>

<pre><code>import UIKit
import SwiftValidator
import CoreData


class EditNpFormViewController: UIViewController,UITextFieldDelegate, UIViewControllerTransitioningDelegate{

    override func viewDidLoad() {
      super.viewDidLoad()

      // Do any additional setup after loading the view.
      self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(EditNpFormViewController.dismissKeybored)))

      self.npVisitViewTable.dataSource = self
      self.npVisitViewTable.delegate =self

      loadValidaValidationSettings()
      loadUIObjectsSetting()
      populateUIobjects()
    }

    func loadValidaValidationSettings() {
      validator.styleTransformers(success:{ (validationRule) -&gt; Void in

            // clear error label
            validationRule.errorLabel?.hidden = true
            validationRule.errorLabel?.text = &#34;&#34;
            if let textField = validationRule.field as? UITextField {
                textField.layer.borderColor = UIColor.greenColor().CGColor
                textField.layer.borderWidth = 0.5

            }
            }, error:{ (validationError) -&gt; Void in
                print(&#34;error&#34;)
                validationError.errorLabel?.hidden = false
                validationError.errorLabel?.text = validationError.errorMessage
                if let textField = validationError.field as? UITextField {
                  textField.layer.borderColor = UIColor.redColor().CGColor
                  textField.layer.borderWidth = 1.0
                }
      })

      validator.registerField(firstNameTextField, errorLabel:firstNameErrorLabel , rules: )
      validator.registerField(lastNameTextField, errorLabel:lastNameErrorLabel , rules: )
      validator.registerField(brnTextFieled, errorLabel:brnErrorLabel,rules: )
    }

    func loadUIObjectsSetting(){
      self.firstNameTextField.delegate = self
      self.lastNameTextField.delegate = self
      self.brnTextFieled.delegate = self
      self.pickerLhsc.dataSource = self
      self.pickerLhsc.delegate = self
      self.pickerLhsc.tag = 0
      self.ltchTextFieled.inputView = pickerLhsc
      self.ltchTextFieled.delegate= self
      self.ltchTextFieled.hidden = true

    }

    func populateUIobjects(){
      self.firstNameTextField.text = selectedNpForm!.patientFirstName
      self.lastNameTextField.text = selectedNpForm!.patientLastName
      self.brnTextFieled.text = selectedNpForm!.brnNumber
      self.ltchTextFieled.text = pickerDataLtch.filter { $0.uniqId ==selectedNpForm!.ltch }.first?.hospital ?? &#34;&#34;
      self.isPatientLtchResidentSwitch.setOn((selectedNpForm!.isPatientLtchResident == 0 ?false : true), animated: true)
      self.ltchTextFieled.hidden= !(isPatientLtchResidentSwitch.on ? true : false)
      reloadData()

    }

    override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
    }

    //MARK: - Methods
    func dismissKeybored(){
      firstNameTextField.resignFirstResponder()
      lastNameTextField.resignFirstResponder()
      brnTextFieled.resignFirstResponder()
      ltchTextFieled.resignFirstResponder()
    }

    func textFieledShouldReturn(){
      firstNameTextField.resignFirstResponder()
      lastNameTextField.resignFirstResponder()
      brnTextFieled.resignFirstResponder()
      ltchTextFieled.resignFirstResponder()
    }

    func hideKeyboard(){
      self.view.endEditing(true)
    }

    func validationSuccessful() {
      print(&#34;Validation Success!&#34;)
    }

    func validationFailed(errors:[(Validatable, ValidationError)]) {
      print(&#34;Validation FAILED!&#34;)
      // turn the fields to red
      for (field, error) in errors {
            if let field = field as? UITextField {
                field.layer.borderColor = UIColor.redColor().CGColor
                field.layer.borderWidth = 1.0
            }
            error.errorLabel?.text = error.errorMessage // works if you added labels
            error.errorLabel?.hidden = false
      }
    }

    func reloadData(predicate: NSPredicate? = nil) {
      if let selectedNpForm = selectedNpForm {
            if let formVisits = selectedNpForm.visits?.allObjects {
                npVisits = formVisits as!
            }
      } else {
            let fetchRequest = NSFetchRequest(entityName: &#34;NpVisit&#34;)
            fetchRequest.predicate = predicate

            do {
                if let results = try moc.executeFetchRequest(fetchRequest) as? {
                  npVisits = results
                }
            } catch {
                fatalError(&#34;There was an error fetching the list of devices!&#34;)
            }
      }

      npVisitViewTable.reloadData()
    }

    //MARK: -@IBAction
    @IBAction func EditBrn(sender: AnyObject) {
      print(&#34;Validating...&#34;)
      //validator.validate(self)
    }

    @IBAction func saveNpForm(sender: AnyObject) {
      if let selectedNpFormId =moc.objectWithID(selectedNpForm!.objectID) as? NpForm{
            selectedNpFormId.brnNumber = brnTextFieled.text
            selectedNpFormId.patientFirstName = firstNameTextField.text
            selectedNpFormId.patientLastName = lastNameTextField.text
            selectedNpFormId.isPatientLtchResident = isPatientLtchResidentSwitch.on ? true : false
            selectedNpFormId.ltch = hospitalUniqId
      }

      do {
            try moc.save()
      } catch let error as NSError{
            print(&#34;Could not save \(error), \(error)&#34;)
      }
    }

    @IBAction func dosePatientResideLtch(sender: AnyObject) {
      self.ltchTextFieled.hidden= !(isPatientLtchResidentSwitch.on ? true : false)
    }

    // MARK: Validate single field
    // Don&#39;t forget to use UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -&gt; Bool {
      validator.validateField(textField){ error in
            if error == nil {
                // Field validation was successful
            } else {
                // Validation error occurred
            }
      }
      return true
    }

    //MARK: - Segue
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      if(segue.identifier == &#34;addNewNoVisit&#34;){
         if let distination= segue.destinationViewController as? MapViewController{
            distination.clientNpForm._patientFirstName = firstNameTextField.text!
            distination.clientNpForm._patientLastName = lastNameTextField.text!
            distination.clientNpForm._brnNumber = brnTextFieled.text!
            distination.clientNpForm._isPatientLtchResident = isPatientLtchResidentSwitch.on ? true : false
            distination.clientNpForm._ltch = hospitalUniqId
            distination.editNpFormMode = editNpFormMode
            distination.selectedNpForm = selectedNpForm
            }
      }
      if (segue.identifier == &#34;sendNpVisitToVisitDetailSegue&#34;){
            print(&#34;test segue fired &#34;)
      }
    }



    //MARK: - @IBOutlet
    @IBOutlet weak var firstNameTextField: UITextField!
    @IBOutlet weak var lastNameTextField: UITextField!
    @IBOutlet weak var brnTextFieled: UITextField!

    @IBOutlet weak var npVisitViewTable: UITableView!
    @IBOutlet weak var firstNameErrorLabel: UILabel!
    @IBOutlet weak var lastNameErrorLabel: UILabel!
    @IBOutlet weak var brnErrorLabel: UILabel!
    @IBOutlet weak var isPatientLtchResidentSwitch: UISwitch!
    @IBOutlet weak var ltchTextFieled: UITextField!
    @IBOutlet weak var saveNpForm: UIButton!

    //MARK: -VARIABLES
    let validator = Validator()
    var pickerLhsc = UIPickerView()
    var editNpFormMode = FormMode.Edit
    var selectedNpForm = NpForm?()
    var npVisits = ()
    var moc = DataController().managedObjectContext
    var hospitalUniqId:Int = 0

    var pickerDataLtch:[(uniqId:Int,hospital:String)] = [(229,&#34;hospital 1&#34;),
                                                         (230,&#34;hospital 2&#34;),
                                                         (231,&#34;hospital 3&#34;)]


}

extension EditNpFormViewController:UIPickerViewDataSource,UIPickerViewDelegate {
    // MARK, - Picker View
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -&gt; Int {
      return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&gt; Int {
      //return pickerDataLhsc.count
      return pickerDataLtch.count
    }


    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
      hospitalUniqId = pickerDataLtch.uniqId
      ltchTextFieled.text = pickerDataLtch.hospital
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int)-&gt; String? {
      return pickerDataLtch.hospital
    }
}

extension EditNpFormViewController: UITableViewDelegate,UITableViewDataSource{
      func tableView(npVisitViewTable: UITableView, numberOfRowsInSection section: Int) -&gt; Int{
            return npVisits.count
      }

      func tableView(npVisitViewTable: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell{
            let cell:UITableViewCell = npVisitViewTable.dequeueReusableCellWithIdentifier(&#34;visitCell&#34;)! as UITableViewCell
            cell.textLabel?.text = &#34;Visit #\(indexPath.row + 1)&#34;
            return cell
      }

      func tableView(npVisitViewTable: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
      }

      func tableView(npVisitViewTable: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -&gt; Bool {
            return true
      }

       func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
      print(&#34;selected row &#34;)

       }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在这个答案中,我假设 <code>didSelectRowAtIndexPath</code> 正在触发。</p>

<p>在您的 <code>didSelectRowAtIndexPath</code> 中,您需要将您创建的 segue 从单元格触发到第二个 ViewController :</p>

<pre><code>func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print(&#34;selected row&#34;, indexPath)
    performSegue(with: &#34;segueIdentifier&#34;)

}
</code></pre>

<p>我不确定您使用的是哪个版本的 Swift,因此您可能需要进行一些细微的更改。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 单元格不能选择在主视图中嵌入 UItableView?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40051131/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40051131/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 单元格不能选择在主视图中嵌入 UItableView?