Как вызвать метод определенного класса из другого класса (созданного в этом конкретном классе)? - PullRequest
1 голос
/ 12 марта 2010

Я создал TTModelViewController. в методе createModel я создал TTURLRequestModel. После загрузки содержимого в TTURLRequestModel я хочу вызвать метод в моем TTModelViewController.

TTModelViewController

- (void) createModel {
     requestModel = [[singlePostModel alloc] initWithId:@"54"];
}

- (void)didLoadModel:(BOOL)firstTime {
      NSLog(@"loaded");
}

TTURLRequestModel (singlePostModel)

- (void)requestDidFinishLoad:(TTURLRequest*)request {
      //doing something
     [super requestDidFinishLoad:request];
}

сначала я подумал, что "didLoadModel" вызывается после вызова requestDidFinishLoad, но это раньше.

Итак, как я могу вызвать метод в моем TTModelViewController после завершения загрузки запроса? Есть ли метод, который уже делает это, и мне нужно только перезаписать это? или что-то еще?

спасибо

// если кто-нибудь знает, как это сделать с помощью Three20, кто-нибудь может сказать мне, как это сделать в целом?

редактировать


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

@interface TTModelViewController {
}

- (void)modelFinishedLoading;

@end

и теперь я вызываю этот метод в моем классе моделей

[controller modelFinishedLoading];

в этот момент xcode выдает предупреждение «метод no -modelFinishedLoading найден».

почему? я реализовал это в интерфейсе, а также в части реализации TTModelViewController.

это имеет отношение к этому @class в моем singlePostModel?

@class singlePostViewController;
@interface singlePostModel : TTURLRequestModel

1 Ответ

2 голосов
/ 16 марта 2010

Я бы сделал так, чтобы подкласс TTURLRequestModel, что, как я подозреваю, вы уже сделали, основываясь на названии вашего класса (singlePostModel). В этом подклассе добавьте переменную-член, которую вы можете использовать, чтобы указать на ваш TTModelViewController. Что-то вроде:

Определение класса:

class TTModelViewController;
@interface singlePostModel : TTURLRequestModel {
    TTModelViewController *controller;
} 

- (id) initWithId:(String *)id forController:(TTModelViewController *)controller;

@end

Реализация:

@implementation singlePostModel {
- (id) initWithId:(String *)id forController:(TTModelViewController *)mvc {
  if (self = [super initWithId:id]) {
    controller = mvc;
  }
}

- (void)requestDidFinishLoad:(TTURLRequest*)request {
  [controller callMyMethodHere];
  [super requestDidFinishLoad:request];
}

@end

Когда вы инициализируете его, вы будете использовать:

- (void) createModel {
  requestModel = [[singlePostModel alloc] initWithId:@"54" forController:self];
}

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

Например, ваш делегат приложения имеет ссылку на основной View Controller для приложения, поскольку он настроен из основного NIB. Это легко доступно, используя

((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).myMainViewController
...