Swift:UIPopoverPresentationControllerDelegate委托变为空

时间:2016-07-24 22:10:15

标签: ios swift delegates

即使在设置协议和委托后,我尝试从UIPopoverPresentationController返回的内容也会失败。

我在我的控制器中包含自定义委托(SavingViewControllerDelegate)和UIPopoverPresentationControllerDelegate,它将调用popover。用户将点击正在我的控制器中调用函数的UIBarButton。在控制器中,我以编程方式打开Popover:

        let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("PopoverProfileViewController") as! ProfileViewController
        vc.modalPresentationStyle = UIModalPresentationStyle.Popover
        let popover: UIPopoverPresentationController = vc.popoverPresentationController!
        popover.barButtonItem = sender as? UIBarButtonItem
        popover.delegate = self
        self.presentViewController(vc, animated: true, completion:nil)

在这个视图控制器中,我有这个功能

func sendLoginStatus(status : Bool) {
    print("LoginStatus")
    print(status)
}

在popover的视图控制器中,我添加了一个协议:

protocol SavingViewControllerDelegate
{
    func sendLoginStatus(status : Bool)
}

我还在func sendLoginStatus(状态:Bool)中添加了一个突破,它返回"委托SavingViewControllerDelegate?一些"

在ProfileViewController中:

class ProfileViewController: UIViewController {
    var delegate : SavingViewControllerDelegate?

当用户点击按钮时,bool值应该发送回呼叫控制器。

@IBAction func logoutButton(sender: AnyObject) {
    print("sendStatus")
    delegate?.sendLoginStatus(true)
    dismissViewControllerAnimated(true, completion: nil)
}

我在委托中添加了断点?.ndndLoginStatus(true),它返回"委托SavingViewControllerDelegate?"没有。永远不会调用sendLoginStatus。

1 个答案:

答案 0 :(得分:1)

您使用了UIPopoverPresentationController的委托以及您自己的协议的预期结果。

您应该创建对自己的委托的引用,而不是设置符合协议public function getAccess(){ $username = $this->input->post('username'); $password = $this->input->post('password'); if($array = $this->User_model->login($username,$password)) { echo json_encode($array); } else { echo 'NO DATA!'; } } 的popover委托:

UIPopoverPresentationControllerDelegate

您现在可以使用自己的委托函数和UIPopoverPresentationController委托函数:

let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("PopoverProfileViewController") as! ProfileViewController

// Setting the SavingViewControllerDelegate
vc.delegate = self
vc.modalPresentationStyle = UIModalPresentationStyle.Popover

let popover: UIPopoverPresentationController = vc.popoverPresentationController!
popover.barButtonItem = sender as? UIBarButtonItem

// Setting the UIPopoverPresentationControllerDelegate
popover.delegate = self

self.presentViewController(vc, animated: true, completion:nil)

旁注1:为了防止代表保留周期,我建议使用extension YourClass : UIPopoverPresentationControllerDelegate { // All functions of the UIPopoverPresentationControllerDelegate you wish to use } extension YourClass : SavingViewControllerDelegate { func sendLoginStatus(status : Bool) { // Code } } 而不仅仅是var ~~

旁注2:通常的做法是在委托函数中包含发件人:

weak var delegate: SavingViewControllerDelegate?