2010-04-23 4 views
8

Я очень хорошо знаком с написанием приложений на основе VB, но не знаком с Xcode (и Objective C). Я прошел через множество учебных пособий в Интернете и понял основы и как взаимодействовать с Interface Builder и т. Д. Однако я действительно борюсь с некоторыми базовыми концепциями языка C и буду благодарен за любую помощь, которую вы можете предложить. Heres my problem ...Как вызвать функцию из другого файла класса

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

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

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

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

+0

Лучше использовать делегат –

+0

я на голосование Урс надеюсь получить его обратно в мой ответ тоже –

ответ

1

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

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

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

31

В deklaration вашего метода:

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

The - в начале декларации указывает на то, что это мгновенный метод. Это означает, что вы должны создать экземпляр своего класса для его вызова. Если бы существовал +, метод был бы методом класса, и вы могли бы назвать его так, как вы делаете в своем коде.

Пример:

@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]; 
0

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

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

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

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

только разница + знак вместо -

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

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

т.е.

FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init]; 
[FirstViewControllerObj writeToServer:str]; 
+0

Спасибо за Ответов ih ave пробовал оба метода сейчас, но, похоже, не может заставить их работать. Я продолжаю получать следующие ошибки: ниже SummaryViewController SummaryViewControllerObj = [[SummaryViewController alloc] init]; ошибка: объект с переменным размером не может быть инициализирован ошибка: статически выделенный экземпляр класса object-c «SummaryViewController» ошибка: статически выделенный экземпляр класса object-c «SummaryViewController» и ниже [summaryViewControllerObj writeToServer: str]; Предупреждение: «SummaryViewController» может не отвечать на «-writeToServer:» Ошибка: невозможно преобразовать в тип указателя –

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

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

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

Или что-то подобное.

4

В строке:

[FirstViewController writeToServer:str]; 

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

[firstViewControllerObject writeToServer:str]; 

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

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

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

0

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]; 

} 
Смежные вопросы