2015-01-31 2 views
1

У меня есть странная проблема. Странность исходит из того факта, что код выполняется просто отлично на игровой площадке, но он не в симуляторе ...
Короче говоря, у меня есть класс, который должен анализировать документ, который я ленивый, и вызывать метод парсинга из VC. Функция разбора вызывается в классе, но не функции делегата (начальный парсинг, найденные символы и т. Д.). Это своего рода с ума, так как же установка работает просто отлично на детской площадке ...
Swift NSXMLParserDelegate не называется

Синтаксический класс (и протокол):

protocol DefintionFetching { 
    func fetchingDidFinish(results: [String: NSMutableAttributedString]) 
} 

class DefinitionFetcher: NSObject, NSXMLParserDelegate { 
    var delegate: DefintionFetching 

    var parser = NSXMLParser() 
    let url = NSURL(string: "http://dexonline.ro/definitie/soapta/xml")! 

    var element = String() 
    var finalDefinitions = [String: NSMutableAttributedString]() 

    init(delegate: DefintionFetching) { 
     self.delegate = delegate 
     super.init() 
     parser.delegate = self 
    } 

    func fetch() { 
     println("fetch called") // this gets called 
     parser = NSXMLParser(contentsOfURL: url)! 
     parser.parse() 
    } 

    func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject: AnyObject]!) { 
     // this doesn't get called 
    } 
} 

И VC вызова класс:

class DexVC: UIViewController, DefintionFetching { 
    lazy var definitionFetcher: DefinitionFetcher = DefinitionFetcher(delegate: self) 

    func fetchingDidFinish(results: [String: NSMutableAttributedString]) { } 

    @IBAction func doShit(sender: AnyObject) { 
     definitionFetcher.fetch() 
    } 
} 

Любая помощь будет безумно высоко оценена!

+1

Проверьте возвращаемое значение 'parser.parse()'. Если это неверно, напечатайте 'parser.parserError()'. –

+0

Проверено, это правда –

ответ

4

Вы заменили свойство parser из исходного экземпляра.

func fetch(){ 
    println("fetch called") 
    parser = NSXMLParser(contentsOfURL: url)! 
// ^^^^^^^^^ HERE 
    parser.parse() 
} 

так, parser.delegate = self в init совершенно бессмысленно.

попробовать:

func fetch(){ 
    println("fetch called") 
    parser = NSXMLParser(contentsOfURL: url)! 
    parser.delegate = self // <-- ADDED 
    parser.parse() 
} 
+0

Большое спасибо, сэр, вы спасатель жизни. Я должен упомянуть, что сначала делегат находился в функции выборки, но он не работал, поэтому я переместил его в init. Теперь это так. Weird. Не могли бы вы объяснить немного больше? Большое большое спасибо! –

+1

Я не знаю, почему это не сработало при первой же попытке. Возможно, была какая-то простая ошибка. В любом случае, свойство 'delegate' является свойством экземпляра, вы должны установить * после *, созданный экземпляр. – rintaro

+0

Хорошо, я понимаю, большое спасибо. Я был уверен, что это как-то связано с делегацией. Ура! –

Смежные вопросы