【问题标题】:Swift 2 didSelectRowAtIndexPath UIAlertController push segue to TVC with 4 stringsSwift 2 didSelectRowAtIndexPath UIAlertController 使用 4 个字符串将 segue 推送到 TVC
【发布时间】:2016-06-09 03:58:33
【问题描述】:

我在将四个标签的值从警报控制器传递到另一个 tableViewController 中的新单元格时遇到了一些问题。我不确定我是否使用最佳方法将其传递给“添加”操作。

这里是相关的sn-ps ->

ProductTableViewController.swift

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ProductTableViewCell
    // Get the row data for the selected row
    let product = frc.objectAtIndexPath(indexPath) as! ProductItem

    cell.productcodeLabel.text = product.productcode
    cell.detailLabel.text = product.detail
    cell.quantityLabel.text = "MOQ \(product.quantity as! Double)"
    cell.barcodeLabel.text = product.barcode

 //MARK: - Add Item Alert
    var quantityTextField = UITextField()

    let alertController = UIAlertController(title: "\(product.detail!)\n \("MOQ \(product.quantity as! Double)")", message: nil, preferredStyle: .Alert)
    let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: {(alert: UIAlertAction!) in print("Cancel Button Pressed")
         alertController.dismissViewControllerAnimated(true, completion: nil)
    })

    let action = UIAlertAction(title: "Add", style: .Default, handler: { (action) -> Void in
        // Now do whatever you want with inputTextField (remember to unwrap the optional)
        quantityTextField = alertController.textFields![0] as UITextField
        print("Add Button Pressed")
        print("You entered \(product.productcode!) \(quantityTextField.text!)")

        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let orderVC = storyBoard.instantiateViewControllerWithIdentifier("addProduct") as! OrderViewController
        orderVC.productcodeString = product.productcode! as String!
        orderVC.detailString = product.detail! as String!
        orderVC.quantityString = quantityTextField.text! as String!
        orderVC.barcodeString = product.barcode! as String!

        self.navigationController?.pushViewController(orderVC, animated: true)


    })

        alertController.addTextFieldWithConfigurationHandler{ (quantityTextField) -> Void in
        quantityTextField.placeholder = "Enter quantity here..."
        quantityTextField.font = UIFont.systemFontOfSize(15)
        quantityTextField.autocorrectionType = UITextAutocorrectionType.No
        quantityTextField.keyboardType = UIKeyboardType.NumberPad
        quantityTextField.returnKeyType = UIReturnKeyType.Done
        quantityTextField.clearButtonMode = UITextFieldViewMode.WhileEditing;
        quantityTextField.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
        quantityTextField.delegate = self

        }


    alertController.addAction(cancelAction)
    alertController.addAction(action)

    self.presentViewController(alertController, animated: true, completion:{})

    }

OrderViewController.swift

class OrderViewController: UITableViewController{

var productcodeString = String()
var detailString = String()
var quantityString = String()
var barcodeString = String()

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell", forIndexPath: indexPath) as! OrderTableViewCell

    // Configure the cell...
    cell.productcodeLabel.text = productcodeString
    cell.detailLabel.text = detailString
    cell.quantityLabel.text = "X \(quantityString)"
    cell.barcodeLabel.text = barcodeString

    return cell
   }

segue“addProduct”是从 productTVC 中提取的,以作为情节提要中的 orderVC tableviews 的显示细节 segue。

我在控制台中得到一个 LLDB 就行了 让 orderVC = storyBoard.instantiateViewControllerWithIdentifier("addProduct") 为!订单视图控制器 警告:无法从 dyld 共享缓存加载任何 Objective-C 类信息。这将显着降低可用类型信息的质量。

我希望有人可以帮助我完成这部戏剧,因为我有点失落。

【问题讨论】:

  • 什么时候出现这个错误?
  • 当我点击警报中的添加按钮时。

标签: ios swift segue uialertcontroller didselectrowatindexpath


【解决方案1】:

我对你试图用你的代码实现的目标感到很困惑。但是,无需尝试进一步分析,我可以就流程应该如何向您提供一些建议。你应该在这里调用的方法是prepareForSegue

didSelectRowAtIndexPath 触发时,您执行转场addProduct

然后从prepareForSegue你传递信息

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "addProduct") {
        let destination = segue.destinationViewController as! OrderViewController
        let indexPath = tableView.indexPathForSelectedRow
        let product = frc.objectAtIndexPath(indexPath) as! ProductItem
        destination.productcodeString = product.productcode as! String
    }
}

【讨论】:

    【解决方案2】:

    嗨,克里斯,感谢您发布的解决方案。我尝试了您提供的内容,不仅它也引发了错误,而且我的扫描仪segue也坏了。我想一张照片可以澄清我想要弄清楚的事情。正如您所看到的,当一个单元格被选中时,会弹出一个带有文本框的警报视图来接受一个数量,然后按下 Add 按钮来调用带有所有数据的 OrderViewController 的 segue。如果没有来自 alertView 的数据,我什至无法让它继续运行。

    接下来我将尝试构建一个 orderDelegate 并专注于让 segue 在不崩溃的情况下触发。

    【讨论】:

      【解决方案3】:

      终于让segue现在正常工作了! 这是实际传递四个字符串的最终配置。希望对其他人有所帮助...

      在 OrderViewController 中:

      var passedProductcode = String()
      var passedDetail = String()
      var passedQuantity = String()
      var passedBarcode = String()
      

      ProductTableViewController 中的 DidSelectRowAtIndex 方法:

      var selectedPC:String?
      var selectedD:String?
      var selectedQ:String?
      var selectedBC:String?
      
      override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
          tableView.deselectRowAtIndexPath(indexPath, animated: true) //Required!
          let product = frc.objectAtIndexPath(indexPath) as! ProductItem
      
          var quantityTextField = UITextField()
      
          let alertController = UIAlertController(title: "\(product.detail!)" , message: "\("Minimum Order Quantity = \(product.quantity!)")", preferredStyle: .Alert)
          let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: {(alert: UIAlertAction!) in print("Cancel Button Pressed")
              alertController.dismissViewControllerAnimated(true, completion: nil)
          })
      
          let action = UIAlertAction(title: "Add", style: .Default, handler: { action in
              quantityTextField = alertController.textFields![0] as UITextField
              //print("Add Button Pressed")
              //print("You entered \(product.productcode!) \(quantityTextField.text!)")
      
              self.selectedPC = product.productcode!
              self.selectedD = product.detail!
              self.selectedQ = quantityTextField.text!//product.quantity!
              self.selectedBC = product.barcode!
              //print("DSRAIP: \(self.selectedPC!)")
              //print("DSRAIP: \(self.selectedD!)")
              //print("DSRAIP: \(self.selectedQ!)")
              //print("DSRAIP: \(self.selectedBC!)")
      
              self.performSegueWithIdentifier("addProduct", sender: self)
      
          })
      
          alertController.addTextFieldWithConfigurationHandler{ (quantityTextField) -> Void in
              quantityTextField.placeholder = "Enter quantity here..."
              quantityTextField.font = UIFont.systemFontOfSize(15)
              quantityTextField.autocorrectionType = UITextAutocorrectionType.No
              quantityTextField.keyboardType = UIKeyboardType.NumberPad
              quantityTextField.returnKeyType = UIReturnKeyType.Done
              quantityTextField.clearButtonMode = UITextFieldViewMode.WhileEditing;
              quantityTextField.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
              quantityTextField.delegate = self
          }
      
          alertController.addAction(cancelAction)
          alertController.addAction(action)
      
          self.presentViewController(alertController, animated: true, completion:{})
      
          }
      
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
          if segue.identifier == "scanner" {
          let scannerViewController: ScannerViewController = segue.destinationViewController as! ScannerViewController
          scannerViewController.delegate = self
          print ("Scanner Segue!")
          } else if segue.identifier == "addProduct" {
             print ("Add Item Segue!")
                  let destination = segue.destinationViewController as! OrderViewController
                  //print("Segue: \(selectedPC!)")
                  //print("Segue: \(selectedD!)")
                  //print("Segue: \(selectedQ!)")
                  //print("Segue: \(selectedBC!)")
                  destination.passedProductcode = (selectedPC)!
                  destination.passedDetail = (selectedD)!
                  destination.passedQuantity = (selectedQ)!
                  destination.passedBarcode = (selectedBC)!
                  }
            }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        相关资源
        最近更新 更多