【发布时间】:2017-02-03 12:52:08
【问题描述】:
我已经创建了BaseClassviewController,我所有的控制器都是从这个控制器派生的。我正在执行以下步骤:
- 在
BaseClassViewController中设置自定义委托。 - 实现
BaseClassViewController中协议的所有功能。 - 然后我推送从
BaseClassViewController派生的HomeController。 - 我再次推
DetailController也源自BaseClassViewController。
现在,当调用委托函数时,我应该在 DetailController 中获得控制权,但我在 HomeController 中获得控制权。
所以我的问题是为什么它不在导航时调用顶部控制器,即DetailController,是否可以在两个控制器中调用委托函数?
P.S 我正在覆盖所有子控制器中的委托函数。
编辑:在阅读了答案和 cmets 之后,我想我还不是很清楚,所以添加以下代码 sn-p。
在助手类中:
@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()
}
}
}
在基类中
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 推到 HomeController 之后。
class DetailViewController: BaseClassViewController{
override func viewDidLoad()
{
super.viewDidLoad()
SampleHelper.sharedInstance.apiCall()
}
override func shouldCallDelegateMethod()
{
//
}
}
现在我的问题是,当从助手类触发委托时,它在HomeViewController 中调用shouldCallDelegateMethod,但在DetailViewController 中没有。但DetailViewController 位于导航数组的顶部。
还有没有可能我可以只用委托在两个控制器中触发相同的功能?
【问题讨论】:
-
请分享您声明和覆盖委托的代码 sn-p。
-
它相当大的代码库以建设性的方式在这里展示。但我认为我已经在概念上以体面的方式解释了它..
-
@Aamir 如果您需要任何具体内容,请告诉我,我可以解释。
-
很不清楚你在这里的意思。什么是“自定义委托”? (你的意思是你已经创建了自己的委托协议?)调用这个委托函数的是什么?为什么你认为它在
DetailController中“应该得到控制”(我不确定这意味着什么)?您认为应该将什么称为“导航中的顶级控制器”?这些类如何继承在这里几乎可以肯定是无关紧要的。您可能错误地接线了。目前尚不清楚您所说的“推动”是什么意思。您是使用故事板转场还是直接呈现?为什么它同时被标记为 ObjC 和 Swift?两者都有吗? -
将委托与单例一起使用是一种反模式。对单例使用完成回调,否则你会一直遇到问题。
标签: ios objective-c iphone swift