Я очень знаком с записью, что VB основывал приложения, но в новинку для XCode (и Objective C). Я прошел многочисленные учебные руководства в сети и понимаю основы и как взаимодействовать с Интерфейсным Разработчиком и т.д. Однако, я действительно борюсь с некоторыми фундаментальными понятиями языка C и был бы благодарен за любую справку, которую можно предложить. Вот моя проблема …
У меня есть простое приложение для iPhone, которое имеет контроллер представления (FirstViewController) и подпредставление (SecondViewController) со связанным заголовком и файлами класса.
В FirstViewController.m имеют функцию, определяемую
@implementation FirstViewController
- (void) writeToServer:(const uint8_t *) buf {
[oStream write:buf maxLength:strlen((char*)buf)];
}
Действительно не имеет значения, какова функция.
Я хочу использовать эту функцию в своем SecondViewController, таким образом, в SecondViewController.m я импортирую FirstViewController.h
#import "SecondViewController.h"
#import "FirstViewController.h"
@implementation SecondViewController
-(IBAction) SetButton: (id) sender {
NSString *s = [@"Fill:" stringByAppendingString: FillLevelValue.text];
NSString *strToSend = [s stringByAppendingString: @":"];
const uint8_t *str = (uint8_t *) [strToSend cStringUsingEncoding:NSASCIIStringEncoding];
FillLevelValue.text = strToSend;
[FirstViewController writeToServer:str];
}
Эта последняя строка - то, где моя проблема. XCode говорит мне, что FirstViewController не может ответить на writeToServer. И когда я пытаюсь запустить приложение, оно отказывает, когда эта функция вызвана.
Я предполагаю, что не полностью понимаю, как совместно использовать функции и что еще более важно, отношения между классами.
В идеальном мире я создал бы глобальный класс, чтобы поместить мои функции в и назвать их как требуется.
Любой совет с благодарностью получен.
В файле FirstViewController.h
вы должны объявить writeToServer
как метод FirstViewController
в разделе @interface
@interface FirstViewController: UIViewController {
}
- (void) writeToServer: (NSString *) str;
@ end
Во-вторых, следующее сообщение, которое вы отправляете, недействительно, поскольку FirstViewController
writeToServer
не является методом класса и допустимо только при вызове из экземпляра класса FirstViewController
.
FirstViewController * firstViewCnt = [[FirstViewController alloc] init];
[firstViewCnt writeToServer: str];
[firstViewCnt release];
Или что-то в этом роде.
если вы хотите вызвать этот метод подобным образом, только объявите метод writeToServer как метод класса (статический метод вкратце ...)
для этого вы объявили и определили его как
+ (void) writeToServer:(const uint8_t *) buf;
+ (void) writeToServer:(const uint8_t *) buf {
[oStream write:buf maxLength:strlen((char*)buf)];
}
, разница только + Знак вместо знака -
Второй вариант - это созданный экземпляр FirstViewController и вызовите существующий метод
ie
FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init];
[FirstViewControllerObj writeToServer:str];
Вам необходимо написать:
- (void) writeToServer:(const uint8_t *) buf;
в вашем файле FirstViewController.h. Это подсказка компилятору, что функция доступна для этого конкретного класса. Ваш код по-прежнему работал бы без этого, потому что фактическая функция реализована, но вы получаете предупреждение, потому что компилятор не проверяет файл .m на наличие существующих функций, когда вы включаете заголовок из другого исходного файла.
В объявлении вашего метода:
- (void) writeToServer:(const uint8_t *) buf;
Знак - в начале объявления указывает, что это мгновенный метод. Это означает, что вы должны создать экземпляр своего класса, чтобы вызвать его. Если бы был знак +, метод был бы методом класса, и вы могли бы вызывать его так же, как в своем коде.
Пример:
@interface MyClass
{ }
- (void) myInstanceMethod;
+ (void) myClassMethod;
@end
Затем в некоторой функции:
[MyClass myClassMethod]; // This is ok
//[MyClass myInstanceMethod]; // this doenst't work, you need an instance:
MyClass *theInstance = [[MyClass alloc] init];
[theInstance myInstanceMethod];
В строке:
[FirstViewController writeToServer:str];
... вы отправляете сообщение writeToServer:
классу FirstViewController
. Вместо этого вам нужно отправить его в объект FirstViewController
. Это означает, что вам нужно получить ссылку на объект FirstViewController
, а затем отправить объекту сообщение writeToServer:
:
[firstViewControllerObject writeToServer:str];
Однако, поскольку существует только одно представление активно на iPhone, у вас не должно быть объектов FirstViewController
и SecondViewController
, существующих одновременно и обменивающихся данными друг с другом. Вместо этого вы должны создать независимые классы для выполнения требуемого класса, и активный контроллер представления должен взаимодействовать с этими классами.
Примечание : «Вы отправляете сообщение sayHello:
объекту myObject
» - это просто еще один способ сказать «вы вызываете writeToServer:
метода объекта myObject
. («Метод» подобен объектно-ориентированной версии функции.)
Я бы рекомендовал прочитать Learning Objective-C и Изучите руководства по Cocoa II на Cocoa Dev Central , чтобы узнать больше о Cocoa / Objective-C и объектно-ориентированном программировании .