2012-03-13 6 views
0

Я пытаюсь передать некоторые данные обратно в контроллер вида из класса объектов.Передача данных между ObjectClass и ViewController

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

So ViewController загружает свои таблицы. Затем внутри этого метода делегата он вызывает класс соединения, который я создал, внутри этого класса conection - методы NSURLConnection, соединяющие и загружающие данные из базы данных, в методе connectionDidFinishLoading этого класса соединения. Я настроил класс разбора и передал все загруженные данные к этому. Затем я разбираю эти данные, и в конце этого анализатора внутри parserDidEndDocument я пытаюсь отправить данные, которые теперь находятся в переменной массива, обратно на мой контроллер отображения для отображения. Однако ... по какой-то причине мои протоколы и делегаты не работают. Я установил протоколы внутри класса m parser и задал делегаты в моем контроллере представления, но никогда не применял его к методу протокола.

Я покажу вам мой код ниже.

parserclass.h

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

parserclass.m

#import "VehicleSearchViewController.h" 
//.. 
@synthesize delegate; 
//.. 


- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    //.. array stuff is set up and i can log it so i know its working.. i just want to show you the protocol and delegate stuff to be clear 
    [[self delegate]sendManufactureArray:filteredArray]; 
} 

Затем перейти на мой взгляд, контроллер, где я надеялся вызвать протокол и получить данные filteredArray обратно.

ViewController.h

#import "EngineResponses.h" //delegates & protocols 
//.. 
@interface SearchViewController : UITableViewController <PassParsedData> { 
//.. 

Viewcontroller.h

#import "EngineResponses.h" 
//.. 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
//.. 
parserClass *pc = [[parserClass alloc] init]; 
    [pc setDelegate:self]; 
//.. 
} 

- (void)sendManufactureArray:(NSArray *)array //Breakpoint here is never accessed 
{ 
    FilterArray = array; 
    [self.tableView reloadData]; 
} 

Как вы можете видеть в этом последнем методе, который является протоколом я звоню, его никогда не обращались к теме. Я проверил, этот вызов

[[self delegate]sendManufactureArray:filteredArray]; 

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

любая помощь была бы высоко оценена! :)

UPDATE:

Я добавил это к моему ViewController.h

//.. 
ParserClass *parserclass; 
//.. 
@property (strong, nonatomic) ParserClass *parserclass; 
//.. 

viewcontroller.m

@synthesize parserclass; 
//.. 
//then I call this in viewdidload 
[engineResponses setDelegate:self]; 
+1

Вы пытались сделать parserClass универсальной переменной вместо локальной для viewdidload? – Eric

+0

Как сказал Эрик, если я не пропущу концепцию дуги, ваш класс pc будет жить только по методу viewdidload, даже если вы установили делегат как сильный, экземпляр pc имеет прочную связь с viewcontroller, но не с другой стороны arround, так что скоро, когда loaddid load завершает все свойства в классе pc, будет nil, и дуговая вещь избавится от него. – Pochi

+0

Я добавил MyClass * myclass; и т. д. в заголовок ViewController и @synthesized it .. тогда я назвал [myclass setDelegate: self]; и все же он не делает это для метода sendManufactureArray ..., который находится в viewcontroller .... :( –

ответ

0

Как уже говорилось в комментариях, ваша pc переменная освобождается в конце блока viewDidLoad, так как единственная ссылка, которую он имеет, выходит за пределы области действия. Если вы хотите, чтобы он продолжал жить, вы должны увеличить его объем (т. Е. Сделать его переменной экземпляра).

+0

правильно, поэтому создайте свойство ** @ (сильное, неатомическое) MyClass * myclass; ** и т. д. затем синтезировал его? –

+0

, поэтому я сделал его глобальной переменной .. но он все еще не решает проблему .. это действительно липкая проблема ... –

+0

вам не нужно делать это свойством, но добавлять это в список переменных в вашем .h-файле. Добавьте эту переменную в фигурный скобок после вашего @interface и назначьте это вместо объявления pc внутри метода viewDidLoad. – borrrden

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