Протоколы и делегаты не работают должным образом - PullRequest
4 голосов
/ 30 марта 2012

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

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

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

Ответы [ 5 ]

1 голос
/ 04 апреля 2012

Я думаю, вам нужно заменить файл 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];
}

// ..

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

viewcontroller.m

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

 - (void)sendManArray:(NSArray *)array
 {
      NSLog(@"%@",array);
 }
0 голосов
/ 02 апреля 2012

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

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

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

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

0 голосов
/ 01 апреля 2012

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

@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 голосов
/ 02 апреля 2012

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

. Поэтому я предлагаю передать делегат вашему методу init в качестве параметра и установитьсвойство SearchViewdelegate перед отправкой сообщения [NSXLMParser parse].

0 голосов
/ 30 марта 2012

Вы звоните

[[self SearchViewdelegate]sendManufactureArray:filteredArray];

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

- (void)sendManArray:(NSArray *)array

Попробуйте позвонить

[[self SearchViewdelegate]sendManArray:filteredArray];

вместо.

...