2016-05-20 5 views
-2

Ich präsentiere meine secondViewController von (percentageViewController) und in der Abweisung Abschluss versuche ich Parameter und Funktionen zu übergeben. Der AttendanceViewController erscheint und die Funktion wird aufgerufen. Das Problem ist, dass alle Objekte gleich Null sind, wenn (@IBOutlet weak var tableView: UITableView! , @IBOutlet weak var boxTypeSKU: UIView!....all) entlassenDismissViewController Parameter übergeben zurück swift

self.presentingViewController!.dismissViewControllerAnimated(true, completion: { _ i 
      let attView: AttendanceViewController = self.storyboard!.instantiateViewControllerWithIdentifier("AttendanceViewID") as! AttendanceViewController 
       attView.currAttendance = self.currAttendance 
       attView.searchProductWithSKU("\(sku)") 

      }) 
+0

' AttendanceViewController "kann instanziiert werden, aber alle diese Anschlüsse werden wahrscheinlich wegen des View-Lifecycle-Prozesses noch nicht angeschlossen. Möglicherweise müssen Sie das Aufrufen von 'searchProductWithSKU' verzögern, bis nach dem Aufruf von' -viewDidLoad' an 'AttendanceViewController' – Aaron

Antwort

0

Das erste, was bemerkt zu werden, dass eine neue Instanz von AttendanceViewController instanziiert wird. Dies bedeutet, dass die Eigenschaften nicht für das richtige Objekt festgelegt werden. Es muss ein Verweis auf den View-Controller vorhanden sein, der die darstellt. Wie das gemacht wird, bleibt Ihnen überlassen, aber ich empfehle einen Callback, der die Variable currAttendance enthält. Dies wäre eine Eigenschaft des präsentierten View-Controllers. Sobald der Rückruf von dem präsentierten Ansichtscontroller aufgerufen wird, kann das übergeordnete Objekt AttendanceViewController seine eigene Eigenschaft festlegen und den präsentierten Ansichtscontroller schließen und die Methode searchProductWithSKU(_:) aufrufen.

0

Ich löste mein Problem mit Protokollen wie diesem Tutorial (http://swiftdeveloperblog.com/pass-information-back-to-the-previous-view-controller/) Ich denke, es ist eleganter und effizienter.

Es ist meine aktualisierte Code:

Im zweiten Ansicht Controller (BarcodeScannerViewController.swift) Ich mache es:

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 
} 

} 

Im ersten View-Controller (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 
    } 


}