#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 из класса, в котором они определены, и любых подклассов. Это просто специально выделенный тип переменной. Однако вам нужно получить ссылку на правильный экземпляр во время выполнения — я думаю, что именно здесь у вас возникают проблемы.