DismissViewController传递参数返回swift

时间:2016-05-20 14:46:54

标签: ios swift uiviewcontroller

我从(attendanceViewController)呈现我的secondViewController并在解除完成时我正在尝试传递参数和调用函数。出现AttendanceViewController并调用该函数。问题是当解雇(@IBOutlet weak var tableView: UITableView! , @IBOutlet weak var boxTypeSKU: UIView!....all)

时,所有对象都是零
 self.presentingViewController!.dismissViewControllerAnimated(true, completion: { _ i
            let attView: AttendanceViewController = self.storyboard!.instantiateViewControllerWithIdentifier("AttendanceViewID") as! AttendanceViewController
                attView.currAttendance = self.currAttendance
                attView.searchProductWithSKU("\(sku)")

            })

2 个答案:

答案 0 :(得分:0)

首先要注意的是,AttendanceViewController的新实例正在被实例化。这意味着未在正确的对象上设置属性。需要引用显示secondViewController的视图控制器。如何完成取决于你,但我推荐一个包含currAttendance变量的回调。这将是呈现的视图控制器上的属性。一旦呈现的视图控制器调用回调,父AttendanceViewController可以设置自己的属性并关闭呈现的视图控制器并调用searchProductWithSKU(_:)方法。

答案 1 :(得分:0)

我使用像这个教程(http://swiftdeveloperblog.com/pass-information-back-to-the-previous-view-controller/这样的协议解决了我的问题。我认为它更优雅和高效。

我的更新代码:

在第二个视图Controller(BarcodeScannerViewController.swift)中,我这样做:

protocol BarcodeScannerProtocol {
    func setSKUScanner(sku: String)
}


class BarcodeScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var delegate:BarcodeScannerProtocol?

func back() {
 let sku = (barcode as NSString).substringWithRange(NSMakeRange(6, 8))
 delegate?.setSKUScanner(sku)
 self.presentingViewController!.dismissViewControllerAnimated(true, completion: { _ in
}

}

在第一个视图控制器(AttendanceViewController.swift)中:

class AttendanceViewController: UIViewController, BarcodeScannerProtocol {
   var strSKUScanner : String?

   override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        if let skuScanned = strSKUScanner {
            searchProductWithSKU(skuScanned)
        } else {
            fetchProducts()
        }
    }

// MARK: BarcodeScannerProtocol functions
    func setSKUScanner(sku: String) {
        self.strSKUScanner = sku
    }


}