2017-11-30 4 views
0

私のポップオーバーからそれを起動した別のクラスにデータを戻そうとしています。私はこれを行うためのパターンは、デリゲートを使用していることを読んで、私はこれをしなかった:NSPopoverのデリゲートフィールドを設定できません

/*MyMainClass.swift*/ 
class MyMainClass: UserInfoPopoverDelegate { 
    var popover: NSPopover = NSPopover() 

    func showAskForUserInfoPopup() { 
     if let button = statusItem.button { 
      if !popover.isShown { 
       popover.delegate = self //error here 
       popover.contentViewController = UserInfoPopupController(nibName: "UserInfoPopup", bundle: nil) 
       popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) 
      } 
     } 
    } 

    func submitAndClose(str: String){ 
     print(str) 
     popover.performClose(nil) 
    } 
} 

その後、私はそのコントローラとのXIBを持っている:

class UserInfoPopupController: NSViewController { 

    @IBOutlet weak var phoneField: NSTextField! 
    @IBOutlet weak var emailField: NSTextField! 
    weak var delegate: UserInfoPopoverDelegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    @IBAction func close(_ sender: Any) { 
     delegate?.submitAndClose(str: "close pressed") 
    } 

    @IBAction func submitDetails(_ sender: Any) { 
     delegate?.submitAndClose(str: "submit pressed") 
    } 
} 

protocol UserInfoPopoverDelegate: class { 
    func submitAndClose(str: String) 
} 

私がコメントをしたところ、問題が発生しましたコードであり、Cannot assign value of type 'MyMainClass' to type 'NSPopoverDelegate'です。私のメインクラスがclass MyMainClass: NSPopoverDevelegateというタイトルの場合、私が実際にやりたくないNSObjectProtocolのすべてのメソッドを実装していないと文句を言うでしょう。

答えて

1

これはすべてかなり混乱しています。 UserInfoPopupControllerにdelegateプロパティを作成しましたが、代わりに代理人をNSPopoverに割り当てています。したがって、コードを次のように変更する必要があります。

func showAskForUserInfoPopup() { 
    if let button = statusItem.button { 
     if !popover.isShown { 
      let contentViewController = UserInfoPopupController(nibName: "UserInfoPopup", bundle: nil) 
      contentViewController.delegate = self //This is where you should be assigning the delegate 
      popover.contentViewController = contentViewController 
      popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY) 
     } 
    } 
} 
+0

「contentViewController?.delegate = self」が必要ですが、そうでなければ動作します – OrangePot

関連する問題