Вызов метода ViewController из класса NSObject

Я пытаюсь вызвать метод, который находится в моем ViewController, из класса NSObject, который выполняет некоторый синтаксический анализ.

Сначала я вызываю класс соединения, который я сделал, который загружает некоторые данные с моего сервера, затем я передаю эти данные классу синтаксического анализатора, который я сделал, теперь я пытаюсь передать эти данные обратно в контроллер просмотра и перезагрузить таблицу это в этом представлении (это в стеке навигации)

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

MyViewController *myViewController = [[MyViewController alloc] init];
    [myViewController initFilterArray:filteredArray];

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

результатом чего является то, что reloaddata вызывает только

  • числосекцийинтаблевиев
  • tableView: количество строк в разделе

тогда это все. любая помощь будет оценена.

ОБНОВЛЕНИЕ: поэтому я пытаюсь настроить протокол/делегата, чтобы посмотреть, решит ли это мою проблему.

так что в моем class.h это то, что я делаю

@protocol PassParsedData <NSObject>
@required
- (void) sendMyArray:(NSArray *)modelArray;
@end
//..
id <PassParsedData> delegate;
//..
@property (strong) id delegate;

потом в кл.м

//..method
[[self delegate]sendMyArray:filteredArray];
//..

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

viewcontroller.h

#import "class.h" //delegates & protocols
//..
interface VehicleSearchViewController : UITableViewController <PassParsedData> {
//..

тогда я называю это так

viewcontroller.m //..

- (void)sendArray:(NSArray *)array
{
    ICMfgFilterArray = array;
    [self.tableView reloadData]; 
}

person C.Johns    schedule 12.03.2012    source источник


Ответы (1)


Одним из способов сделать это может быть рекомендуемый подход делегатов и протоколов. Ваш NSObject объявляет протокол. ViewController фактически реализует протокол и устанавливает себя в качестве делегата. Затем NSObject вызывает метод (не зная, кто его реализует). Это слабосвязанный способ связи между объектами.

Недавно я написал сообщение в блоге на базовое введение в протоколы и делегаты, если вам интересно...

ОБНОВЛЕНИЕ

На основании вашего обновления выше в вопросе. Не забудьте установить ViewController в качестве делегата.

- (void)viewDidLoad {
        // State that you will take care of messages from graphView (provided you have the      protocol implementation!)
        self.yourClass.delegate = self;
    }

И метод в вашем ViewController должен соответствовать подписи протокола. Итак, в ViewController.m

- (void) sendMyArray:(NSArray *)modelArray {
    ICMfgFilterArray = array;
    [self.tableView reloadData]; 
}
person Peter Kelly    schedule 12.03.2012
comment
круто .. На самом деле я только начал это делать сейчас .. Я использовал это между контроллерами представления в прошлом, но теперь у меня есть некоторые проблемы с использованием его между nsobjectclass и viewcontroller .. теперь буду читать ваш блог .. спасибо. - person C.Johns; 13.03.2012
comment
хорошо .. думаю, я в значительной степени установил банкомат. Но когда я вызываю свой протокол, который я настроил в своем классе, он никогда не получает к нему доступ из контроллера представления. Я собираюсь обновить свой вопрос выше со всем, что я сделал, но сделаю это после обеда, поскольку я голоден: P бы было бы здорово, если бы вы могли проверить, как я настраиваю протокол/делегата.. - person C.Johns; 13.03.2012
comment
спасибо .. только что попробовал использовать self.myClass.delegate = self; и выдает ошибку, которая говорит: свойство «myClass» не нашло объект типа viewController - person C.Johns; 13.03.2012
comment
Итак, вам нужно подключить класс к контроллеру, то есть, например, иметь класс как свойство контроллера. Или сделайте так, чтобы другой объект установил контроллер представления в качестве делегата для класса. Что-то должно установить это. Зависит от того, как устроена ваша система. - person Peter Kelly; 13.03.2012
comment
это не то же самое, что добавить параметр в интерфейс .h вот так interface VehicleSearchViewController : UITableViewController ‹PassParsedData› { - person C.Johns; 13.03.2012
comment
ладно, ошибка ушла, я настроил так EngineResponses *engineResponses = [[EngineResponses alloc] init]; [engineResponses setDelegate:self]; но он все еще не получает массив в ViewController - person C.Johns; 13.03.2012
comment
давайте продолжим это обсуждение в чате - person Peter Kelly; 13.03.2012