2016-05-20 2 views
-2

Я представляю свой secondViewController из (attendanceViewController) и в завершении отклонения. Я пытаюсь передать параметры и функции вызова. Появится окно AttendanceViewController и вызывается функция. Проблема заключается в том, что все объекты равны нулю, когда смещать (@IBOutlet weak var tableView: UITableView! , @IBOutlet weak var boxTypeSKU: UIView!....all)DismissViewController, передающий параметр назад 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' может быть создан, но все эти точки, вероятно, еще не будут подключены из-за процесса жизненного цикла представления. Возможно, вам придется отложить вызов 'searchProductWithSKU' до тех пор, пока' -viewDidLoad' не будет вызван на 'AttendanceViewController' – Aaron

ответ

0

Первое, что нужно отметить, что новый экземпляр AttendanceViewController в настоящее время экземпляр. Это означает, что свойства не заданы на правильном объекте. Должна быть ссылка на контроллер вида, который представил secondViewController. Как это делается, зависит от вас, но я рекомендую обратный вызов, содержащий переменную currAttendance. Это будет свойство на представленном контроллере представления. После вызова обратного вызова представленным контроллером представления родительский AttendanceViewController может установить свое собственное свойство и отклонить представленный контроллер представления и вызвать метод searchProductWithSKU(_:).

0

Я решил проблему, используя протоколы, подобные этому учебнику (http://swiftdeveloperblog.com/pass-information-back-to-the-previous-view-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 
    } 


} 
Смежные вопросы