2016-07-04 6 views
2

Я хочу вызвать функцию на контроллере представления после того, как модаль был уволен. Я потратил часы, пытаясь заставить это работать, и все ответы, которые я нашел, не сработали. Я следую инструкциям других и настраиваю протокол, но это все еще не работает.Функция запуска после модального отклонения в Swift

MainController:

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate, loadStoreDelegate{ 

Тогда, чтобы вызвать модальный я использую

func displaySelectStorePopup(){ 
     if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectStoreView"){ 
      let selectStoreController = viewController 
      selectStoreController.modalPresentationStyle = .Popover 
      if let sctrl = selectStoreController.popoverPresentationController{ 
       sctrl.delegate = self 
       sctrl.sourceView = self.view 
       sctrl.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0) 

       sctrl.permittedArrowDirections = UIPopoverArrowDirection() 
       delay(0.1){ 
        sctrl.passthroughViews = nil 
       } 

       selectStoreController.modalInPopover = true 

       selectStoreController.preferredContentSize = CGSizeMake(400, 400) 

       self.presentViewController(selectStoreController, animated: true, completion: nil) 
      } 
     } 
    } 

Тогда функция ид нравится использовать

func loadStore() { 
     print(2) 
     //let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("DashboardView") 
     //self.showViewController(vc as! UIViewController, sender: vc) 
    } 

ModalViewController: Протокол

protocol loadStoreDelegate{ 
    func loadStore() 
} 

class SelectStoreViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{... 

var delegate: loadStoreDelegate? 

Затем вызовите функцию Tableview мыши

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
     self.delegate?.loadStore() 
     if(tableView == selectStoreTable){ 
      currentStore = userStores[indexPath.row] 
      self.dismissViewControllerAnimated(false, completion: nil) 
     } 
    } 
+0

Вы звоните 'loadStore () '_before_ вызов' self.dismissViewControllerAnimated (false, completion: no) '. Так что это не «после того, как он был уволен». – matt

+0

Вы установили точку останова в вашей 'didSelectRowAtIndexPath', чтобы увидеть, что происходит? – Paulw11

+0

Да, я получаю нулевое значение от делегата. –

ответ

1

Ваш класс SelectStoreViewController имеет свойство delegate экземпляра. Но вы никогда не устанавливаете это свойство ни на что. Так что это nil, когда вы self.delegate?.loadStore(). Поэтому, естественно, ничего не происходит.

Я думаю, что вы хотите что-то вроде этого:

func displaySelectStorePopup(){ 
    if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectStoreView") as? SelectStoreViewController { 
     let selectStoreController = viewController 
     selectStoreController.delegate = self // * 
     // ... and so on ... 
+0

Во всех примерах я видел, как они ссылаются на делегата? На что я его устанавливаю? –

+0

К экземпляру ViewController. Именно это вы пытаетесь использовать в качестве своего делегата ('loadStoreDelegate'). Ваш вопрос не очень ясен, но я добавил код, который показывает, что я думаю, что вы пытаетесь сделать. – matt

+0

, когда я пытаюсь это сделать, selectStoreController не имеет метода делегирования, поэтому я не могу его установить. переменная ctrl имеет метод делегата, но это не решает проблему. –

0

После большого прочтения кажется, что использование поповера является то, что мешает мои желаемые результаты от делегата. Я решил это решить, создав класс для рабочей станции, который содержит ссылку на текущее представление, а затем функцию, которая выполняет необходимое мне действие.

Класс:

class Workstation{ 
    var currentView: UIViewController? = nil 
    var currentStore : Store? = nil 

    func loadInStore(store: Store){ 
     currentStore = store 
     if let view = currentView{ 
      let vc : AnyObject! = view.storyboard!.instantiateViewControllerWithIdentifier("DashboardView") 
      view.showViewController(vc as! UIViewController, sender: vc) 
     } 
    } 

    class var workstationInstance: Workstation{ 
     struct Static { 
      static let instance = Workstation() 
     } 
     return Static.instance 
    } 
} 

SecondController:

override func viewDidDisappear(animated: Bool) { 
     if let store = selectedStore{ 
      Workstation.workstationInstance.loadInStore(store) 
     } 
    } 

В моей основной контроллер я просто загружается во всплывающем окне и установки текущего вида

override func viewDidAppear(animated: Bool) { 
    Workstation.workstationInstance.currentView = self 
} 

func displaySelectStorePopup(){ 
     if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("SelectStoreView"){ 
      let selectStoreController = viewController 
      selectStoreController.modalPresentationStyle = .Popover 
      if let sctrl = selectStoreController.popoverPresentationController{ 
       sctrl.sourceView = self.view 
       sctrl.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds),0,0) 

       sctrl.permittedArrowDirections = UIPopoverArrowDirection() 
       delay(0.1){ 
        sctrl.passthroughViews = nil 
       } 

       selectStoreController.modalInPopover = true 

       selectStoreController.preferredContentSize = CGSizeMake(400, 400) 

       self.presentViewController(selectStoreController, animated: true, completion: nil) 
      } 
     } 
    }