2011-04-28 178 views
0

大家好,我的英语不是很好,所以我会尽我所能来解释我的问题 我是新的可可和Xcode的,所以也许我的问题是很容易,我想如何从另一个类的方法访问类的变量?

我有课,这基本上是一个公式为注册客户端信息,那里我定义了一个方法 - (void)searcht:(NSString *)s;这种方法进行查询到的代码= 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的一个子类,我想调用此方法,当用户按下输入,我可以访问该方法,但我无法更改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

如果您可以重新格式化代码以使其更具可读性,将会有所帮助。另外,我不太理解你遇到的问题。您能否指出您的示例代码中的哪些内容无法正常工作?具体而言,你可以删除正在工作的代码,使其更清楚什么不是? – Dov 2011-04-28 17:31:54

+0

我的代码工作aat,但是,当我从我的子类searchfield.m中调用我在customers.m中定义的方法时,它无法更改customers.h中定义的IBoutlets的字符串值,所以我想我错过了一些重要的东西关于继承 – 2011-04-28 17:40:04

+0

当您调用'-searcht:'并且它可以工作时,客户实例定义在哪里?你如何得到它? – Dov 2011-04-28 17:45:56

回答

1

看起来您的IBOutlet连接已损坏。当您在-keyDown事件中创建customers的实例时,您的所有插座都未连接。这就是为什么它坏了。这不是继承的问题,而是面向对象的设计。你可能需要重新思考你的功能如何相互交流。

为了证明是否是这样的话(我很抱歉,但我有一些麻烦,阅读你的代码),在你的-searcht:功能添加日志语句,看它是否存在:

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

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

以及建议的解决方案

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

虽然这是一个创可贴的解决方案。你可能想阅读一些design patterns used in Cocoa code。这可能会为您提供一些关于如何构建类的更好的想法。

+0

我已经这样做了,并在效果为空 – 2011-04-28 18:44:11

+0

我用解决方案更新了我的答案,它有帮助吗? – Dov 2011-04-28 19:31:06

+0

另一个问题。我可以在一个类中声明变量,并在另一个类中使用方法来访问和赋值给这个变量。那么在我的父类使用这个变量给我的IBOutlets stringValue? – 2011-04-28 20:07:30

相关问题