代理之间无效-Objective-C Mac OSX



ECHOAppDelegate.m:

- (void)charlieInputTextHandler:(NSString *)theMessage {
    if (jarvisSecondTimeCheck1 == TRUE) {

    NSRunAlertPanel(@"ECHO", theMessage, @"", @"", @"");
    NSData *sendData1 = [theMessage dataUsingEncoding:NSUTF8StringEncoding];
    [[inputPipe1 fileHandleForWriting] writeData:sendData1];
    NSData *sendReturn1 = [@"r" dataUsingEncoding:NSUTF8StringEncoding];
    [[inputPipe1 fileHandleForWriting] writeData:sendReturn1];
    [ContentsTextField1 insertText:theMessage];
    [ContentsTextField1 insertText:@"r"];

    } else {
            NSRunAlertPanel(@"ECHO", @"The task is not running; therefore, you cannot send DATA to JARVIS.", @"", @"", @"");
    }
}

ChatController.m:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
    ECHOAppDelegate *echo = [[ECHOAppDelegate alloc] init];
    [echo charlieInputTextHandler:[message stringValue]];
    if(![jid isEqual:[message from]]) return;

    if([message isChatMessageWithBody])
    {
        NSString *messageStr = [[message elementForName:@"body"] stringValue];
        NSString *paragraph = [NSString stringWithFormat:@"%@nn", messageStr];
        NSMutableParagraphStyle *mps = [[[NSMutableParagraphStyle alloc] init] autorelease];
        [mps setAlignment:NSLeftTextAlignment];
        NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:2];
        [attributes setObject:mps forKey:NSParagraphStyleAttributeName];
        [attributes setObject:[NSColor colorWithCalibratedRed:250 green:250 blue:250 alpha:1] forKey:NSBackgroundColorAttributeName];
        NSAttributedString *as = [[NSAttributedString alloc] initWithString:paragraph attributes:attributes];
        [as autorelease];
        [[messageView textStorage] appendAttributedString:as];
    }
}

好吧,出于某种原因,jarvisSecondTimeCheck1(一个布尔全局变量)返回FALSE,尽管我知道900%这是真的,因为我在applicationDidFinishLaunching中澄清了这一点。

代码的另一部分:

NSData *sendData1 = [theMessage dataUsingEncoding:NSUTF8StringEncoding];
[[inputPipe1 fileHandleForWriting] writeData:sendData1];
NSData *sendReturn1 = [@"r" dataUsingEncoding:NSUTF8StringEncoding];
[[inputPipe1 fileHandleForWriting] writeData:sendReturn1];
[ContentsTextField1 insertText:theMessage];
[ContentsTextField1 insertText:@"r"];

也不起作用。但是,我知道这是有效的。是因为我正在从另一个委托触发charlieInputTextHandler吗?

谢谢!

您丢失了大量相关代码。粗略猜测,我认为这是一条关于出了什么问题的重要线索:

ECHOAppDelegate *echo = [[ECHOAppDelegate alloc] init];

您不应该多次实例化您的应用程序委派。我会期待以下内容:

ECHOAppDelegate *echo = (ECHOAppDelegate *)[UIApplication sharedApplication].delegate;

我假设您在原始实例上设置jarvisSecondTimeCheck1,并期望它在您实例化的任何其他实例上设置。对象不是这样工作的。我强烈建议阅读应用程序代理和学习Objective-C:A Primer上的iOS应用程序编程指南部分。

听起来你的一个指针是零。向nil对象发送消息会得到nil,这可以解释为什么你没有看到预期的结果。因此,请检查所有指针和IBOutlet变量,以确保它们设置正确。还要检查任何假设!

最新更新