Как получить доступ к методу экземпляра пользовательского класса в ObjC (программирование iOS) - PullRequest
1 голос
/ 15 июля 2011

Я играю с iOS SDK и пытался использовать самодельный класс в приложении для iPhone.

#import <Foundation/Foundation.h>
#import "UIKit/UIKit.h"

@interface MyPoint
: NSObject {
   CGFloat x;
   CGFloat y;
}
- (void) setX:(CGFloat)x_;
- (void) setY:(CGFloat)y_;
- (CGFloat) getX;
- (CGFloat) getY;
- (CGFloat) getDistance;

@end

Это заголовок моего класса Point. Теперь в приложении я хочу ввести 2 цифры (в двух разных текстовых полях), а затем, когда я нажимаю кнопку «Вычислить», я вызываю функцию getDistance

- (IBAction)calcDistance:(id)sender {
  CGFloat x = [fieldx.text doubleValue];
  CGFloat y = [fieldy.text doubleValue];
  [point setX:(x)];
  [point setY:(y)];
  CGFloat test = [point getX];
  CGFloat test2 = [point getY];
  CGFloat result = [point getDistance];
  NSString *resultString = [[NSString alloc] initWithFormat: @"Distance: %f",result];    
  resultLabel.text = resultString;
  [resultString release];
}

У меня сложилось впечатление, что

[name method]

- это способ доступа к методам-членам указателя, но он ничего не делает, при отладке любого из значений, которые я хочу назначить описанным выше способом, ничего не меняется.

Наконец, интерфейс моего приложения:

@interface iOS4ViewController : UIViewController {
   UITextField*    fieldx;
   UITextField*    fieldy;
   UILabel*        resultLabel;
   MyPoint* point;
}

Надеюсь, мне было достаточно ясно, что кто-то может указать на очевидную ошибку, которую я делаю:)

Спасибо!

Ответы [ 5 ]

1 голос
/ 15 июля 2011

Мне кажется, что вы, возможно, не выделили фактический экземпляр MyPoint.Работает ли это, если вы попробуете это так:

- (IBAction)calcDistance:(id)sender {
    point = [[MyPoint alloc] init];
    CGFloat x = [fieldx.text doubleValue];
    CGFloat y = [fieldy.text doubleValue];
    [point setX:(x)];
    [point setY:(y)];
    CGFloat test = [point getX];
    CGFloat test2 = [point getY];
    CGFloat result = [point getDistance];
    NSString *resultString = [[NSString alloc] initWithFormat: @"Distance: %f",result];    
    resultLabel.text = resultString;
    [resultString release];
    [point release];
}

Что касается того, как вызвать метод для экземпляра пользовательского класса (или любого другого объекта в Objective-C), вы правы, правильныйсинтаксис [myObjectVarName method].

0 голосов
/ 15 июля 2011

Прежде всего: спасибо за помощь. Это работает теперь, когда я позвонил

 point = [[MyPoint alloc] init];

в рамках функции calcDistance, как предлагается aroth (и другие).

@ EmptyStack, в файле реализации были определены сеттер и геттер, но спасибо за подсказку об объявленных свойствах.

Ура!

0 голосов
/ 15 июля 2011

вам также нужно включить файл Point.h, в который вы пытаетесь вызвать методы ...

0 голосов
/ 15 июля 2011

Я предполагаю, что вы не определили те методы получения / установки, объявленные в заголовочных файлах.Если это так, вы должны либо определить их в файле реализации, либо вы можете использовать объявленные свойства , чтобы достичь того, что вам нужно.Создайте свойства в заголовочных файлах следующим образом:

@property(nonatomic) CGFloat x, y;

Синтезируйте его в файле реализации,

@synthesize x, y;

Синтезирующие свойства автоматически создают метод получения и установки для свойств.

0 голосов
/ 15 июля 2011

Вы выделили point?Если объект имеет значение nil, вызов метода для него вернет nil, а не ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...