V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
ivanlw
V2EX  ›  iDev

消息里面的delegate问题^纠结好久了……

  •  
  •   ivanlw ·
    tolinwei · 2012-05-21 00:00:06 +08:00 · 2924 次点击
    这是一个创建于 4596 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个类A(View controller类),里面有个函数a是按钮的按下时间,内容是:
    [B b]

    B是自己建的一个NSObject类,里面有个函数b(里面用到了NSXmlparser),还有NSXmlparser的3个回调函数,已经在类的头文件里面加了<NSXmlParserDelegate>

    但是在按下按钮,发送[B b]消息的时候,一直进入不了这个回调函数……
    请问是不是这样子不可以呢?有没有什么方法解决?
    13 条回复    1970-01-01 08:00:00 +08:00
    jerry
        1
    jerry  
       2012-05-21 00:06:24 +08:00
    NSXmlparser对象指定Delegate为self了么
    ivanlw
        2
    ivanlw  
    OP
       2012-05-21 12:31:45 +08:00
    @jerry 嗯,有的~
    就是如果不用[B b]这种方式使用delegate,而是在一个类里直接使用的话,是能进入回调的……(特意测试了一下)

    而使用后,代码照样子copy过来的……
    ivanlw
        3
    ivanlw  
    OP
       2012-05-21 16:05:12 +08:00
    @jerry

    嗯~麻烦你了……我检查了好久

    A类里面调用的地方
    [SimilarityCaculation paticipleSentence:originSentence.text];
    (这个相当于[B b])

    B类里面:
    显示@interface后面加<NSXMLParserDelegate>

    然后3个回调函数:
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
    }
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
    }
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
    }

    然后是呗调用的函数b
    - (void)b
    {
    ......
    获得NSData data;
    ......
    //开始parser
    NSXMLParser *addressParser = [[NSXMLParser alloc] initWithData:data];
    [addressParser setDelegate:self];
    //[addressParser shouldResolveExternalEntities:YES];
    [addressParser parse];

    }

    在回调函数中加了断点……但是没有进去……
    jerry
        4
    jerry  
       2012-05-21 17:15:38 +08:00
    代码没有问题啊,你检查一下是不是你获取的NSData有问题
    altchen
        5
    altchen  
       2012-05-21 17:40:32 +08:00
    在b方法设置断点看下是否有进入.感觉有点像你调用的时候B对象为nil了...
    ivanlw
        6
    ivanlw  
    OP
       2012-05-21 19:25:54 +08:00
    @jerry 加了下面两句
    NSString *stringData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", stringData);

    能正常打印出来data……
    ivanlw
        7
    ivanlw  
    OP
       2012-05-21 19:26:56 +08:00
    @ivanlw 能进入b函数,一直到最后一句[addressParser parse];都能执行到,就是没进入回调……好囧啊,我以为是消息里面的函数不能进入回调呢……
    ivanlw
        8
    ivanlw  
    OP
       2012-05-21 19:50:13 +08:00
    @altchen 补充下,函数b声明和定义成+的方法了……
    jerry
        9
    jerry  
       2012-05-21 20:31:01 +08:00   ❤️ 1
    @ivanlw 类方法(+)不行,self为const Class,不是实例,在NSXMLParser里如何去调用self里的实例方法(-方法)呢? 真想用类方法你需要使用单例模式,先实例化一个单例
    altchen
        10
    altchen  
       2012-05-21 20:39:46 +08:00   ❤️ 1
    b是类方法,但b在里面用self是类对象,应该实例化一个对象a再[setDelegate:a]试下
    altchen
        11
    altchen  
       2012-05-21 20:41:34 +08:00
    额,没看到9f回了。。。。
    jerry
        12
    jerry  
       2012-05-21 20:44:22 +08:00
    @altchen 呵呵,发现在自己语言表达能力严重下降,看来以后需要多回帖少潜水了
    ivanlw
        13
    ivanlw  
    OP
       2012-05-21 21:38:46 +08:00
    自己找到问题啦……声明称+的进入不了回调函数……

    要声明成-的,然后实例化以后再调用这个方法!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1135 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 101ms · UTC 23:10 · PVG 07:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.