如何使用另一个类中的方法从类中访问变量?

时间:2011-04-28 17:04:18

标签: objective-c cocoa macos

你好我的英语不是很好,所以我会尽力解释我的问题 我是cocoa和xcode的新手,所以也许我的问题比我想的更容易

我有类,这基本上是寄存器客户端信息的处方集,在那里我定义了一个方法 - (void)searcht:(NSString *)s;此方法对数据库进行查询,其中code = s

- (void) searcht:(NSString *)s{
    PGSQLConnection *connection1= [[PGSQLConnection alloc] init];
NSString *cmd=[[NSString alloc] initWithFormat:@"select * from oc_master_customer where customer_id=%@",s  ];
    NSLog(@"%@", cmd);


    if ([connection1 connect]){
        NSLog(@" ENTRO  %@", [connection1 lastError]);
                PGSQLRecordset *rs1 = [connection1 open:cmd];
        if (![rs1 isEOF])
        {
            NSLog(@" ENTRO  2 %@", [connection1 lastError]);
            [matchcode setStringValue:
             [[rs1 fieldByName:@"matchcode"] asString]];
            NSLog(@" MATCHCODE %@", [matchcode stringValue]);
            NSLog(@" MATCHCODE 2 %@", [[rs1 fieldByName:@"matchcode"] asString]);
            [name1 setStringValue:
             [[rs1 fieldByName:@"name1"] asString]];
            [zip setStringValue:
             [[rs1 fieldByName:@"zip"] asString]];
            [bank_code setStringValue:
             [[rs1 fieldByName:@"bank_code"] asString]];
            [bank_account setStringValue:
             [[rs1 fieldByName:@"bank_account"] asString]];
            [bank_name setStringValue:
             [[rs1 fieldByName:@"bank_name"] asString]];
            [bank_iban setStringValue:
             [[rs1 fieldByName:@"bank_iban"] asString]];
            [bank_swift setStringValue:
             [[rs1 fieldByName:@"bank_swift"] asString]];
            [city setStringValue:
             [[rs1 fieldByName:@"city"] asString]];
            [city_part setStringValue:
             [[rs1 fieldByName:@"citypart"] asString]];
            [street setStringValue:
             [[rs1 fieldByName:@"street"] asString]];
            [country setStringValue:
             [[rs1 fieldByName:@"country_code"] asString]];
        }

        [connection1 close];
        [rs1 close];}
}

我在NSSearchfield中使用这个方法并且它工作得很好,现在我做了nsearchfield的子类,我想在用户按下enter时调用此方法,我可以访问该方法但我无法更改字符串值来自IBOutlets。我已经宣布IBOutlets为@public。我的代码来自nssearchfiel子类

-(void)keyUp:(NSEvent*)event
    {
        if ([event keyCode]==36){
        [[self window] selectKeyViewFollowingView:self];
        customers* c= [[customers alloc] init];
        NSLog(@"Key released: %@",[self stringValue]);
        [c searcht:[self stringValue]];
        }
    }

我的问题是,如果我从其他类调用,我定义的方法不起作用  有人知道我必须做什么或者我不知道

1 个答案:

答案 0 :(得分:1)

看起来您的IBOutlet连接已损坏。在customers活动中创建-keyDown的实例时,您的所有商店都没有连接。这就是为什么它被打破了。这不是继承的问题,而是面向对象的设计。您可能需要重新考虑您的功能如何相互通信。

要证明是否是这种情况(对不起,但我在阅读您的代码时遇到一些问题),请在-searcht:函数中添加一条日志语句,看它是否存在:

NSLog(@"name1field: %@", name1);

我猜你会看到类似:name1field: (null)

的内容

更新了建议的解决方案

如果你有IBOutlets(这对我来说是一个可疑的决定),这意味着它在你的笔尖中实例化。您可能想要做的(假设您没有彻底改变代码的结构)是在NSSearchField子类中创建一个插座,将其连接到您的nib中的customers对象,并使用它,而不是创建customers的新实例。

但这是一种创可贴解决方案。您可能想要了解一些design patterns used in Cocoa code。这可能会为您提供有关如何构建类的更好的想法。