2015-01-31 5 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

확인 반환 값()'. false 인 경우,'parser.parserError()'를 출력하십시오. –

+0

체크 됨, 사실임 –

답변

4

초기 인스턴스의 parser 속성을 바 꾸었습니다.

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

때문에, init에서 parser.delegate = self 완전히 의미가 없습니다.

시도 : parser.parse`의

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

많은 감사합니다. 선생님, 생명의 은인입니다. 먼저 대리자가 가져 오기 기능에 있었지만 작동하지 않아 init에서 옮겼습니다. 이제는 그렇습니다. 기묘한. 좀 더 설명해 주시겠습니까? 많은 많은 감사합니다! –

+1

첫 시도에서 왜 작동하지 않았는지 나는 모른다. 어쩌면 몇 가지 간단한 실수가있었습니다. 어쨌든'delegate' 속성은 인스턴스 속성입니다. 인스턴스가 생성 된 후에 * 설정해야합니다. – rintaro

+0

알았어, 많이 고마워. 나는 그것이 대표단과 관련이 있다는 것을 확신했다. 건배! –