Как вызвать функцию из другого файла класса - PullRequest
8 голосов
/ 23 апреля 2010

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

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

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

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

Ответы [ 6 ]

31 голосов
/ 23 апреля 2010

В декларации вашего метода:

- (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];
3 голосов
/ 23 апреля 2010

В строке:

[FirstViewController writeToServer:str];

... вы отправляете сообщение writeToServer: в FirstViewController класс .Вместо этого вам нужно отправить его на FirstViewController объект .Это означает, что вам нужно получить ссылку на объект FirstViewController, а затем отправить сообщение object writeToServer::

[firstViewControllerObject writeToServer:str];

Однако, поскольку активен только один видна iPhone не должно быть одновременно объектов FirstViewController и SecondViewController, взаимодействующих друг с другом.Вместо этого вы должны создать независимые классы для выполнения требуемого класса, и активный контроллер представления должен взаимодействовать с этими классами.

Примечание : "Вы отправляете сообщение sayHello:для объекта myObject "это просто еще один способ сказать" вы вызываете writeToServer: метод объекта myObject. ("метод" подобен объектно-ориентированной версии функции.)

Я бы порекомендовал прочитать учебники Objective-C и Learn Cocoa II на Cocoa Dev Central , чтобы узнать больше о Cocoa / Objective-Cи объектно-ориентированное программирование .

2 голосов
/ 23 апреля 2010
  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];
    

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

1 голос
/ 23 апреля 2010

Вам нужно написать:

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

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

0 голосов
/ 10 мая 2015

FirstViewController.h

@interface FirstViewController: UIViewController
- (void)GetItNow;

FirstViewController.m

- (void)GetItNow{
    NSLog(@"I acheived");    } 

  - (IBAction)goToSecondView:(id)sender {

    SecondViewController* Second= [[SecondViewControlleralloc] initWithNibName:@"SecondViewController" bundle:nil];
    rqVC.addId = self.addId;
    [self.view addSubview:Second.view];

}

SecondViewController.h

@property (nonatomic, assign) id delegate;

SecondViewController.m

- (IBAction)Action_LoadFunds:(id)sender {
    [self.view removeFromSuperview];
    [_delegate GetItNow];

}
0 голосов
/ 23 апреля 2010

, если вы хотите вызывать этот метод как этот, только объявите метод writeToServer как метод класса (статический метод вкратце ...)

для этого вы должны объявить и определить его как

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

+ (void) writeToServer:(const uint8_t *) buf {
    [oStream write:buf maxLength:strlen((char*)buf)];   
}

Единственная разница - + знак вместо -

  • знак указывает, что метод является методом класса (статический) и - знак, например, метод (нестатический)

Второй параметр создает экземпляр FirstViewController и вызывает существующий метод

т.е.

FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init];
 [FirstViewControllerObj writeToServer:str];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...