【问题标题】:My Protocol is not Calling我的协议没有调用
【发布时间】:2015-08-28 05:33:42
【问题描述】:

我正在使用协议调用方法,但我的方法没有调用。有没有我使用的示例。

这是我的代码:

视图控制器

    class ViewController: UIViewController {
      override func viewDidLoad() {
        super.viewDidLoad()
                // Do any additional setup after loading the view.
    }


extension ViewController :ViewController1Delegate
{
    func hello()
    {
        println("hbgyguyg");
    }
}

在视图控制器 1 中

import UIKit
@objc
protocol ViewController1Delegate
{
   optional func hello()
}
class ViewController1: UIViewController {
 var delegate: ViewController?
    override func viewDidLoad() {
        super.viewDidLoad()
                    delegate?.hello()
             }

}

请帮助,我是 Swift 的新手。任何帮助都会得到帮助。提前致谢

【问题讨论】:

  • 你在用segue吗?
  • 您是否设置了您的代表?即myVC1.delegate = myVC; 到目前为止,我们只能看到您已经在ViewController1 中定义了一个委托,并且还在ViewController 中实现了该方法,但您还没有告诉 ViewController1 ViewController 是预期的委托。顺便说一句,那行应该说var delegate: ViewControllerDelegate? 吗?

标签: ios iphone swift protocols


【解决方案1】:

一个示例演示。

ViewController 文件

import UIKit

class ViewController: UIViewController, PopUpViewControllerDelegate
{
    var popupVC: PopUpViewController!;

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view!.backgroundColor = UIColor.whiteColor();

        self.popupVC = PopUpViewController();
        self.popupVC.delegate = self;


        self.showPopUpVC();
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func popUpViewControllerDidPressOK(popUpVC: PopUpViewController) {

        println("Yay?");

        self.closePopUpVC();
    }

    func showPopUpVC()
    {
        let delayTime = dispatch_time(DISPATCH_TIME_NOW,
            Int64(1.0 * Double(NSEC_PER_SEC)))

        dispatch_after(delayTime, dispatch_get_main_queue()) {

            self .presentViewController(self.popupVC, animated: true, completion: nil);

        }
    }

    func closePopUpVC()
    {
        let delayTime = dispatch_time(DISPATCH_TIME_NOW,
            Int64(1.0 * Double(NSEC_PER_SEC)))

        dispatch_after(delayTime, dispatch_get_main_queue()) {

            self.dismissViewControllerAnimated(true, completion: nil);

        }
    }
}

PopUpViewController 文件

import UIKit

protocol PopUpViewControllerDelegate
{
    func popUpViewControllerDidPressOK(popUpVC: PopUpViewController);
}

class PopUpViewController: UIViewController {

    var delegate: PopUpViewControllerDelegate!;

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view!.backgroundColor = UIColor.redColor();

        // Do any additional setup after loading the view.

        self.delegate!.popUpViewControllerDidPressOK(self);
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

请注意,在我的 ViewController viewDidLoad() 方法中,我有一行初始化弹出视图控制器,然后将其委托设置为 ViewController 本身:

self.popupVC = PopUpViewController();
self.popupVC.delegate = self; // you're missing this line I believe ?

我不使用 Interface Builder 或 Storyboard,但可能会在 Storyboard 中选择您的 VC1,然后查看连接检查器,看看您是否将一行从“delegate”拖到您的 ViewController 文件所有者的东西上。

最后,您应该会在 1 秒后看到一个红色屏幕弹出窗口,然后是“Yay?”这个词。登录到你的 Xcode 控制台,最后 popupVC 消失了。

【讨论】:

  • 我有点困惑。如果我们这样做 var delegate: ViewController? = ViewController() 我的方法在没有设置委托的情况下被调用。那么协议的用途是什么。简单的调用?
  • 你声明了一个名为delegate的变量,但你给它的数据类型为ViewController,换句话说,你告诉iOS名为delegate的变量将存储一个实例的ViewController。这不是你应该做的,你想创建一个ViewControllerDelegate 的实例(注意额外的“代表”字吗?)。
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多