Как вызвать функцию из другого файла класса

Я очень знаком с записью, что 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. И когда я пытаюсь запустить приложение, оно отказывает, когда эта функция вызвана.

Я предполагаю, что не полностью понимаю, как совместно использовать функции и что еще более важно, отношения между классами.

В идеальном мире я создал бы глобальный класс, чтобы поместить мои функции в и назвать их как требуется.

Любой совет с благодарностью получен.

8
задан Laurent Etiemble 23 April 2010 в 07:43
поделиться

5 ответов

  1. В файле FirstViewController.h вы должны объявить writeToServer как метод FirstViewController в разделе @interface

     @interface FirstViewController: UIViewController {
    } 
     
     - (void) writeToServer: (NSString *) str; 
     
     @ end 
     
  2. Во-вторых, следующее сообщение, которое вы отправляете, недействительно, поскольку FirstViewController writeToServer не является методом класса и допустимо только при вызове из экземпляра класса FirstViewController .

     FirstViewController * firstViewCnt = [[FirstViewController alloc] init]; 
     [firstViewCnt writeToServer: str]; 
     [firstViewCnt release]; 
     

Или что-то в этом роде.

2
ответ дан 5 December 2019 в 04:58
поделиться

если вы хотите вызвать этот метод подобным образом, только объявите метод 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];
0
ответ дан 5 December 2019 в 04:58
поделиться

Вам необходимо написать:

- (void) writeToServer:(const uint8_t *) buf;

в вашем файле FirstViewController.h. Это подсказка компилятору, что функция доступна для этого конкретного класса. Ваш код по-прежнему работал бы без этого, потому что фактическая функция реализована, но вы получаете предупреждение, потому что компилятор не проверяет файл .m на наличие существующих функций, когда вы включаете заголовок из другого исходного файла.

1
ответ дан 5 December 2019 в 04:58
поделиться

В объявлении вашего метода:

- (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];
31
ответ дан 5 December 2019 в 04:58
поделиться

В строке:

[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 и объектно-ориентированном программировании .

3
ответ дан 5 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: