简体   繁体   中英

Cannot set delegate field of NSPopover

I'm trying to pass data back from my popover to another class which launched it. I read that the pattern to do this is using delegates, so I did this:

/*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)
    }
}

Then I have a xib with its controller:

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)
}

The problem happens where I left the comment in the code, and is Cannot assign value of type 'MyMainClass' to type 'NSPopoverDelegate' . If my main class is titled class MyMainClass: NSPopoverDevelegate it will complain that i dont implement all the methods of NSObjectProtocol which I dont really want to do.

This is all pretty jumbled. You created a delegate property on your UserInfoPopupController, but you are assigning a delegate to the NSPopover instead. So you need to change your code to something like this:

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)
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM