2012-03-30 2 views
4

У меня была эта случайная проблема, возникающая между мной, пытающейся что-то работать и теперь .. Я даже попытался перезагрузить старый снимок, который я знаю, что 100% работает, и я просто не могу понять это дерьмо.Протоколы и делегаты не работают должным образом

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

Class.h

//This passes data back to the VehicleSearchViewController 
@protocol SearchViewParsedData <NSObject> 
- (void)sendManArray:(NSArray *)array; 
- (void)sendModArray:(NSArray *)array; 
@end 
//.. 
id <SearchViewParsedData> SearchViewdelegate; 
//.. 
//Delegates that will be acessed inside EngineRequests for passing the data mack to the viewcontroller 
@property (strong) id <SearchViewParsedData> SearchViewdelegate; 
//.. 

class.m

@synthesize SearchViewdelegate; 
//.. 
//TODO: add if statments in this method so you can pass the data to the right methods and Views 
- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    if ([methodName isEqualToString:@"GetMan"]) { 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAMAN",@"T"]; 
    NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]; 

     NSLog(@"%@", filteredArray); 
    [[self SearchViewdelegate]sendMan:filteredArray]; 
    } 
//.. 

Так вот мой класс, то в мою ViewController

viewcontroller.h

#import "myClass.h" 
//.. 
@interface MyVewController : UITableViewController <SearchViewParsedData> { 
//.. 
MyClass *myClassResponse; 
//.. 

ViewController. m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
//.. 
engineResponses = [[EngineResponses alloc] init]; 
[engineResponses setSearchViewdelegate:self]; 
//.. 
} 


#pragma - EngineResponses Reciver methods 
- (void)sendManArray:(NSArray *)array 
{ 
    MyFilterArray = array; 
    [self.tableView reloadData]; 
} 

Это сводит меня с ума. Я уверен, что у меня все идеально, но его просто никогда не делаю для viewcontroller.m - (void) sendManArray ... если у кого-то есть идеи, я бы с удовольствием их услышал.

Это журнал, который генерируется, когда я добавляю в этом NSLog

NSLog(@"Checking filtered array %@ %@", [self SearchViewdelegate], filteredArray); 

производит:

Checking filtered array (null) (
     { 
     ISMAN = F; 
     ISVAR = T; 
     MAN = "BLAAA"; 
     MANID = 3; 
    }, 
     { 
     ISMAN = F; 
     ISVAR = F; 
     MAN = "BANG"; 
     MANID = 3; 
    }, 
//etc 
+3

делегатов традиционно слабы, _unsafe_unretained или назначать, не сильно. И возможно ли, что MyFilterArray не является alloc'd и init'd? – CodaFi

+0

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

+0

Что происходит, когда вы регистрируетесь например: NSLog (@ "% @% @", [self SearchViewdelegate], filterArray); ?? Учитывая симптомы, которые вы описываете, я бы поставил свой [массив] – danh

ответ

-1

Так что это довольно сумасшедший .. Я решил эту ошибку, ее совершенно не связанной с моими делегатами деклараций и т.д.

я была продиктована Xcode, чтобы обновить свой отладчик на прошлой неделе, это в конечном итоге сломав имитатор, или по крайней мере, xcode при попытке установить на симулятор. Двигаясь дальше, я не смог решить эту проблему, по крайней мере до сегодняшнего дня. Я вернулся к своему старому отладчику в настройках схемы, поэтому я вернулся в GDB из LLDB .. это фиксировало мою ошибку симулятора и ... мои делегаты протокола, которые не работали ...

что за черт ??? ! Надеюсь, это решает кто-то проблему elses .. какая абсолютная боль в прикладе.

однако теперь мне интересно, почему LLDB вызывает эти проблемы? если вы можете ответить, что плохо дать вам очки репутации у меня есть на предложение :)

+2

Скорее всего, все еще были ваши заявления делегатов. Сильные для делегатов не могут быть более ошибочными. – Sam

+0

что он должен быть объявлен тогда? –

+0

Слабый. Сильная будет удерживать переменную. – Sam

0

Вы звоните

[[self SearchViewdelegate]sendManufactureArray:filteredArray]; 

но ваше определение метода делегата

- (void)sendManArray:(NSArray *)array 

Try вызова

[[self SearchViewdelegate]sendManArray:filteredArray]; 

вместо этого.

+0

opps это опечатка. в моем коде у меня есть оба одинаковые. –

+0

Это все еще опечатка. Он говорит 'sendMan', а не' sendManArray' – CodaFi

+0

Согласен, это все еще неправильно ... вы можете скопировать + вставить код? Нет смысла добавлять его, если это не точный код, который вы используете. Небольшая разница может сделать или сломать код. – rosslebeau

0

У вас, вероятно, все еще есть опечатка. Для того, чтобы найти его во время компиляции вы можете (временно) изменить определение протокола к:

@protocol SearchViewParsedData <NSObject> 
- (void)sendModArray:(NSArray *)array; 
@required 
- (void)sendManArray:(NSArray *)array; 
@end 

Также попробуйте изменить ваш - (void)parserDidEndDocument:(NSXMLParser *)parser немного:

- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    if ([methodName isEqualToString:@"GetMan"]) 
    { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAMAN",@"T"]; 
     NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]; 

     NSLog(@"%@", filteredArray); 
     if (!self.SearchViewdelegate) 
     { 
      if ([self.searchViewdelegate respondsToSelector: @selector(sendManArray:)]) 
      { 
       NSLog (@"ok, calling my delegate"); 
       [[self.searchViewdelegate] sendManArray:filteredArray]; 
      } 
      else 
      { 
       NSLog (@"my delegate doesn't implement sendManArray:"); 
      } 
     } 
     else 
     { 
      NSLog (@"i have no delegate"); 
     }  
    } 
    //.. 

Это также не является хорошей идеей для собственности имя, начинающееся с капитала письмо.Не ошибка, но вы действительно должны рассмотреть вопрос о переименовании SearchViewdelegate в searchViewdelegate

Вы также не показал нам свой parsedDataArrayOfDictionaries код, но вы могли бы рассмотреть вопрос об изменении:

NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]; 

к:

NSArray *filteredArray = [NSArray arrayWithArray: [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]]; 
+0

ОК, поэтому я внедрил приведенный выше оператор if, и я получаю ** мой делегат не реализует sendManArray: ** response ... Я также переключил свой фильтрованный массив на предложенный выше. Я также добавил @requiered, но с этим ничего не случилось. –

+0

@ C.Johns: o.k., теперь вы знаете, где проблема. Поскольку ваш опубликованный код содержит эти опечатки, я предполагаю, что ваш исходный код тоже. Я бы проверял имена методов делегата char-by-char. –

+0

Как реализовать sendManArray? Я инициализировал его в .h так же, как ** id SearchViewdelegate; **, а также @synthesized it .. что еще я могу сделать? –

0

Ваш EngineResponses класс является делегатом NSXMLParser. Вы пытаетесь отправить сообщение на ваш SearchViewdelegate (кстати, что с этим написанием?) Из метода делегирования NSXMLParser, а свойство - nil. Поэтому единственный вывод заключается в том, что вы устанавливаете свойство после вызова метода parse на своем NSXMLParser.

Таким образом, мое предложение состоит в том, чтобы передать делегата в ваш метод init в качестве параметра и установить свойство SearchViewdelegate, прежде чем отправлять сообщение [NSXLMParser parse].

1

Я думаю, что вам нужно заменить файл Class.m с помощью следующего кода

@synthesize SearchViewdelegate; 
//.. 
//TODO: add if statments in this method so you can pass the data to the right methods and Views 
- (void)parserDidEndDocument:(NSXMLParser *)parser 
{ 
    if ([methodName isEqualToString:@"GetMan"]) { 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAMAN",@"T"]; 
    NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate]; 

    NSLog(@"%@", filteredArray); 
    [[self SearchViewdelegate]sendManArray:filteredArray]; 
} 

// ..

Rest все, что является правильным, но я думаю, что sendMan не доступен (что написано в вашем коде) и в ViewController вызова метода же

viewcontroller.m

в - (void)sendManArray:(NSArray *)array заменить следующим способом

- (void)sendManArray:(NSArray *)array 
{ 
     NSLog(@"%@",array); 
} 
Смежные вопросы