我有一个自定义委托(delegate)/协议(protocol)设置。我使用 alamofire 发出 get 请求,然后解析 json。 json 被排列成 Swift 对象,并传递回 Collection View Controller 。除了派他们回去的委托(delegate)永远不会被召唤。不过其他一切都很完美。这是我的相关代码:
class ViewController: UICollectionViewController, MainCatGallery {
var cats = [Cats]()
let theManager = ImgurAPIManager()
override func viewDidLoad() {
super.viewDidLoad()
loadCats()
theManager.delegate = self
}
func gotCatsArray(x: [Cats]) {
self.cats = x
self.collectionView?.reloadData()
}
}
和:
protocol MainCatGallery {
func gotCatsArray(x: [Cats])
}
class ImgurAPIManager: NSObject {
static let sharedInstance = ImgurAPIManager()
let jsonClass = ParseJson()
var delegate:MainCatGallery?
var catGallery = [Cats]()
func getGallery() {
Alamofire.request(Router.Get)
.response { (request, response, data, error) -> Void in
do {
let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
self.catGallery = self.jsonClass.parseCatGalleryJson(jsonDict)
for x in self.catGallery {
print(x.url!)
}
self.delegate?.gotCatsArray(self.catGallery)
}
catch {
}
}
}
}
所有这些都工作得很好——getGallery() 函数中的 print 语句按预期打印出每个 URL。当它调用委托(delegate)时,它永远不会将对象传递回 View Controller 。并且设置断点表明它永远不会将数据传回。
我之前在其他项目中的委托(delegate)/协议(protocol)中使用过完全相同的模式,并且从未遇到过问题。知道为什么它没有被调用吗?
最佳答案
在您的 ImgurAPIManager 类中,您有一个共享实例,您可以使用它来设置委托(delegate)。
static let sharedInstance = ImgurAPIManager()
但是,在 ViewController 中,您创建了一个新实例并设置了委托(delegate):
let theManager = ImgurAPIManager()
override func viewDidLoad() {
super.viewDidLoad()
theManager.delegate = self
}
更改此行:
theManager.delegate = self
对此:
ImgurAPIManager.sharedInstance.delegate = self
如Roman Sausarnes指出如下:
为了避免将来发生这种混淆,您可以标记您的 ImgurAPIManager
初始化程序 private: private init() { }
。这样您就不会意外地从文件外部创建它的实例。 –
关于ios - 未召集委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34934809/