我创建了BaseClassviewController
,我的所有控制器都是从这个控制器派生的。我正在执行以下步骤:
BaseClassViewController
。BaseClassViewController
。HomeController
来自BaseClassViewController
。DetailController
也来自BaseClassViewController
。现在,当调用委托函数时,我应该在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>
位于导航阵列的顶部。
也有可能我一次只能在两个控制器中触发相同的功能吗?
答案 0 :(得分:0)
在BaseClassviewController
中,您应该拥有delegate
变量/属性。
在HomeController
和DetailController
中,如果您希望该类正在侦听委托回调,则需要将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
。