功能覆盖在iOS中

时间:2017-02-03 12:52:09

标签: ios objective-c iphone swift

我创建了BaseClassviewController,我的所有控制器都是从这个控制器派生的。我正在执行以下步骤:

  1. BaseClassViewController
  2. 中设置自定义代理
  3. BaseClassViewController
  4. 中实现协议的所有功能
  5. 然后我推送HomeController来自BaseClassViewController
  6. 我再次推动DetailController也来自BaseClassViewController
  7. 现在,当调用委托函数时,我应该在DetailController中获得控制权,但我在HomeController中获得了控制权。

    所以我的问题是它为什么不在导航中调用顶级控制器,即DetailController,是否可以在两个控制器中调用委托函数?

    P.S我正在覆盖所有子控制器中的委托函数。

    编辑:在阅读完答案和评论之后,我想我还不太清楚,所以添加以下代码段。

    在助手班:

    @objc protocol SampleDelegate: class
    {
        @objc optional func shouldCallDelegateMethod()
    }
    
    class SampleHelper: NSObject
    {
        var sampleDelegate:SampleDelegate!
        static var sharedInstance = SampleHelper()
    
       //It is triggered 
       func triggerDelegateMethod()
       {
         sampleDelegate!.shouldCallDelegateMethod()
       }
    
       func apiCall()
       {
          let urlString = URL(string: "https://google.com")
          if let url = urlString {
          let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
          if error != nil {
             print(error)
          } else {
          if let usableData = data {
               self. triggerDelegateMethod()
               }
             }
           }
           task.resume()
         }
       }
    }
    

    在BaseClass中

    class BaseClassViewController: UIViewController,SampleDelegate{
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(_ animated: Bool)
        {
            super.viewWillAppear(true)
           SampleHelper.sharedInstance.delegate = self;
        }
    
        func shouldCallDelegateMethod()
        {
            //Override
        }
    
    
    }
    

    在HomeController中,即第一个被推送的控制器

    class HomeViewController: BaseClassViewController{
    
            override func shouldCallDelegateMethod()
            {
                //
            }
    }
    

    在DetailController中,在HomeController之后推送第二个控制器。

    class DetailViewController: BaseClassViewController{
            override func viewDidLoad()
            {
               super.viewDidLoad()
               SampleHelper.sharedInstance.apiCall()
            }
            override func shouldCallDelegateMethod()
            {
                //
            }
    }
    

    现在我的问题是,何时从helper类触发委托,它在shouldCallDelegateMethod中调用HomeViewController但在DetailViewController中调用DetailViewController。但是<script type="text/javascript"> var CaptchaCallback = function(){ $('.g-recaptcha').each(function(index, el) { grecaptcha.render(el, {'sitekey' : 'site key here'}); }); }; </script> 位于导航阵列的顶部。

    也有可能我一次只能在两个控制器中触发相同的功能吗?

4 个答案:

答案 0 :(得分:0)

BaseClassviewController中,您应该拥有delegate变量/属性。

HomeControllerDetailController中,如果您希望该类正在侦听委托回调,则需要将delegate变量/属性设置为self

答案 1 :(得分:0)

修改2

在您发布代码后,我意识到您已使用单例类进行委派。

代理允许对象将消息发送到另一个对象。

您的查询的

答案为“否”。您不能使用委托在两个控制器中同时触发相同的功能。

如果您真的想一次听两个班级的活动,我建议您使用NSNotificationCenter代替委托。

答案 2 :(得分:0)

基本问题是您正在使用带有单例的委托。

viewWillAppear中设置委托也不是一个好的解决方案。简而言之,当显示和隐藏视图控制器时,单身人士的代表将一直在改变。

不要让代表与单身人士一起使用。使用完成回调。否则你会遇到问题。

func apiCall(onCompletion: (() -> Void)?) {
    let urlString = URL(string: "https://google.com")
    if let url = urlString {
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error)
            } else if let usableData = data {
                onCompletion?()
            }
        }

        task.resume()
     }
}

称为

SampleHelper.apiCall {
    // do something
}

答案 3 :(得分:-1)

这不是实现这一目标的正确方法。我认为只在相应的UIViewController中设置委托的正确方法,而不是在BaseViewController上实现该协议,然后覆盖子类。所以你的实现应该是这样的。

在HomeViewController中

class HomeViewController: BaseClassViewController {

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    SampleHelper.sharedInstance.delegate = self;
  }

  func shouldCallDelegateMethod() {
    // Provide implementation
  }

}

在DetailViewController中

class DetailViewController: BaseClassViewController {

  override func viewWillAppear(_ animated: Bool) {
    super.viewDidLoad()
    SampleHelper.sharedInstance.delegate = self;
  }

  func shouldCallDelegateMethod() {
    // Provide implementation
  }

}

使用此imeplementation,您将只拥有一对一通信设计模式,确保调用正确的UIViewController