Как я мог бы получить доступ к переменной из класса с помощью метода из другого класса?

#objective-c #cocoa #macos

#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. Было бы полезно, если бы вы могли переформатировать свой код, чтобы сделать его более читаемым. Кроме того, я не совсем понимаю, с какой проблемой вы столкнулись. Не могли бы вы, пожалуйста, указать, что в вашем примере кода не работает должным образом? Если быть точным, можете ли вы удалить работающий код, чтобы было понятнее, что не работает?

2. мой код работает нормально, но, когда я вызвал метод, который я определил в customers.m из моего подкласса searchfield.m, он не может изменить строковые значения из IBOutlets, определенных в customers.h, поэтому, я думаю, я упускаю что-то важное о наследовании

3. Когда вы вызываете, -searcht: и это работает, где определяется этот customers экземпляр? Как к нему добраться?

4. searht определен в customers. когда я вызывал его у клиентов, он работал отлично. затем я создал подкласс nssearchfield, который импортирует customers.h, и в событии keyup я хотел вызвать метод, но он не может достичь переменных, определенных в customers

5. Когда он вызывается и он работает, есть ли где-нибудь код, подобный вашей строке customers* c= [[customers alloc] init]; ? Если нет, то где customers создан экземпляр? Похоже, это корень вашей проблемы.

Ответ №1:

Похоже, что ваши соединения IBOutlet разорваны. Когда вы создаете экземпляр customers в -keyDown событии, ни один из ваших выходов не подключен. Вот почему это не работает. Это проблема не столько с наследованием, сколько с объектно-ориентированным дизайном. Вероятно, вам нужно переосмыслить, как ваши функции взаимодействуют друг с другом.

Чтобы доказать, так ли это (извините, но у меня возникли некоторые проблемы с чтением вашего кода), добавьте в свою -searcht: функцию инструкцию log, чтобы проверить, существует ли она:

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

Я предполагаю, что вы увидите что-то вроде: name1field: (null)

Обновлено предлагаемым решением

Если у вас там есть IBOutlets (что кажется мне сомнительным решением), это означает, что он создан в вашем nib. Что вы, вероятно, захотите сделать (при условии, что вы не будете кардинально изменять структуру своего кода), так это создать выход в вашем NSSearchField подклассе, подключить его к customers объекту в вашем nib и использовать это вместо создания нового экземпляра customers .

Однако это простое решение. Возможно, вы захотите ознакомиться с некоторыми шаблонами проектирования, используемыми в Cocoa code. Это может дать вам несколько лучших идей о том, как структурировать ваши классы.

Комментарии:

1. Еще один вопрос . могу ли я объявлять переменные в классе и использовать методы в другом классе для доступа и присвоения значений этим переменным. затем в моем родительском классе используйте эти переменные, чтобы присвоить строковое значение моим IBOutlets?

2. Я не думаю, что ваши проблемы имеют какое-либо отношение к наследованию. Я думаю, вам нужно прочитать о том, как работают NIBs и IBOutlets. Вы можете получить доступ к IBOutlets из класса, в котором они определены, и любых подклассов. Это просто специально выделенный тип переменной. Однако вам нужно получить ссылку на правильный экземпляр во время выполнения — я думаю, что именно здесь у вас возникают проблемы.