Add completion handler to presentViewControllerAsSheet(NSViewController)?

前端 未结 2 801
甜味超标
甜味超标 2021-01-22 01:31

I am attempting to present a sheet configuration view (AddSoundEffect) for my main window/view controller (I\'m using storyboards), and when the configuration view

相关标签:
2条回答
  • 2021-01-22 02:11

    The easiest way to detect sheet opening or closing is to use the Sheet Notifications:

    class ViewController: NSViewController, NSWindowDelegate {
    
        override func viewDidLoad(){
            NSApplication.sharedApplication().windows.first?.delegate = self
        }
        func windowDidEndSheet(notification: NSNotification) {
    
        }
        func windowWillBeginSheet(notification: NSNotification) {
    
        }
    }
    
    0 讨论(0)
  • 2021-01-22 02:20

    Delegation pattern is the easiest way for you.

    // Replace this with your tuple or whatever data represents your sound effect
    struct SoundEffect {}
    
    protocol AddSoundViewControllerDelegate: class {
      func soundViewController(controller: AddSoundViewController, didAddSoundEffect: SoundEffect)
    }
    
    //
    // Let's say this controller is a modal view controller for adding new sound effects
    //
    class AddSoundViewController: UIViewController {
      weak var delegate: AddSoundViewControllerDelegate?
    
      func done(sender: AnyObject) {
        // Dummy sound effect info, replace it with your own data
        let soundEffect = SoundEffect()
    
        //
        // Call it whenever you would like to inform presenting view controller
        // about added sound effect (in case of Done, Add, ... button tapped, do not call it
        // when user taps on Cancel to just dismiss AddSoundViewController)
        //
        self.delegate?.soundViewController(self, didAddSoundEffect: soundEffect)
    
        // Dismiss self
        self.dismissViewControllerAnimated(true, completion: {})
      }
    }
    
    //
    // Let's say this controller is main view controller, which contains list of all sound effects,
    // with button to add new sound effect via AddSoundViewController
    //
    class SoundEffectsViewController: UIViewController, AddSoundViewControllerDelegate {
      func presentAddSoundEffectController(sender: AnyObject) {
        if let addSoundController = self.storyboard?.instantiateViewControllerWithIdentifier("AddSoundEffect") as? AddSoundViewController {
          addSoundController.delegate = self
          self.presentViewController(addSoundController, animated: true, completion: {})
        }
      }
    
      func soundViewController(controller: AddSoundViewController, didAddSoundEffect: SoundEffect) {
        // This method is called only when new sound effect is added
      }
    }
    

    Another way is to use closures:

    // Replace this with your tuple or whatever data represents your sound effect
    struct SoundEffect {}
    
    //
    // Let's say this controller is a modal view controller for adding new sound effects
    //
    class AddSoundViewController: UIViewController {
      var completionHandler: ((SoundEffect) -> ())?
    
      func done(sender: AnyObject) {
        // Dummy sound effect info, replace it with your own data
        let soundEffect = SoundEffect()
    
        //
        // Call it whenever you would like to inform presenting view controller
        // about added sound effect (in case of Done, Add, ... button tapped, do not call it
        // when user taps on Cancel to just dismiss AddSoundViewController)
        //
        self.completionHandler?(soundEffect)
    
        // Dismiss self
        self.dismissViewControllerAnimated(true, completion: {})
      }
    }
    
    //
    // Let's say this controller is main view controller, which contains list of all sound effects,
    // with button to add new sound effect via AddSoundViewController
    //
    class SoundEffectsViewController: UIViewController {
      func presentAddSoundEffectController(sender: AnyObject) {
        if let addSoundController = self.storyboard?.instantiateViewControllerWithIdentifier("AddSoundEffect") as? AddSoundViewController {
          addSoundController.completionHandler = { [weak self] (soundEffect) -> () in
            // Called when new sound effect is added
          }
          self.presentViewController(addSoundController, animated: true, completion: {})
        }
      }
    }
    

    Or many other ways like sending notification, ... Whatever suits your needs. But delegation pattern or closures is the best way to go in this specific case.


    I missed that your question is about NSViewController. This example is for iOS, but same pattern can be used on OS X without any issues.

    0 讨论(0)
提交回复
热议问题