协议和代表无法正常工作

时间:2012-03-30 03:00:04

标签: iphone ios delegates protocols

我在尝试处理某些事情之间弹出了这个随机问题现在......我甚至尝试重新加载我知道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.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 个答案:

答案 0 :(得分: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];
}

// ..

休息所有的事情都是正确的,但我认为sendMan不可用(在你的代码中写的)和在ViewController中调用相同的方法

<强> viewcontroller.m

- (void)sendManArray:(NSArray *)array中的

替换为以下方法

 - (void)sendManArray:(NSArray *)array
 {
      NSLog(@"%@",array);
 }

答案 1 :(得分:0)

您正在致电

[[self SearchViewdelegate]sendManufactureArray:filteredArray];

但您的委托方法定义是

- (void)sendManArray:(NSArray *)array

尝试拨打

[[self SearchViewdelegate]sendManArray:filteredArray];

代替。

答案 2 :(得分: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]];

答案 3 :(得分:0)

您的EngineResponses班级是NSXMLParser的代表。您尝试使用SearchViewdelegate委托方法向NSXMLParser发送邮件(顺便说一下,该拼写是什么?),该属性为nil。因此,唯一的结论是,您在parse上调用NSXMLParser方法后设置了该属性。

所以我的建议是将代理作为参数传递给您的init方法,并在发送SearchViewdelegate消息之前设置[NSXLMParser parse]属性。

答案 4 :(得分:-1)

所以这很疯狂..我已经解决了错误,它与我的代表声明等完全无关。

上周我被xcode提示更新我的调试器,这最终破坏了我的模拟器,或者至少尝试部署到模拟器时的xcode。继续前进我无法解决这个问题,至少到今天为止。我在示意图设置中恢复了我的旧调试器,所以我从LLDB返回到GDB ..这修复了我的模拟器错误和...我的协议代表没有工作......

哎呀??? 希望这能解决别人的问题......对接的绝对痛苦。

然而现在我想知道为什么LLDB会导致这些问题?如果你能回答那个病,请给你我提供的声望点:)