iPhone - 从我的委托访问viewController变量的问题

时间:2011-07-27 08:23:14

标签: iphone objective-c cocoa-touch

大家好,这是我在这里发表的第一篇文章,所以我会尽量保持清醒。

因此,在我的项目中,我需要使用SOAP从webService获取xml文档,然后在NSMutableArray中解析它(已完成)。然后我想在tableview中显示我的表格内容。问题是,在我的委托中,我无法访问viewController的任何内容。

我有3个类,SOAP_TestViewController,SOAP_TestAppDelegate和XMLParser。我将包含解析文件的数组从XMLParser发送到Appdelegate,然后我想更新我的viewController中的数组以使用它来更新我的tableview。

这里有一些代码,可能有助于理解。

#import "SOAP_TestAppDelegate.h"
#import "SOAP_TestViewController.h"
#import "XMLParser.h"

@implementation SOAP_TestAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {        

[window addSubview:viewController.view];

NSLog(@"%@", viewController.donnees);  //Here I can get what I want.

[window makeKeyAndVisible]; 

}

-(void)afficher{

NSLog(@"%@", viewController.donnees);  //But there, it returns (null)...

[viewController reload];

}


- (void)dealloc {

[viewController release];

[window release];

[super dealloc];

}

@end

我花了好几个小时才找到解决方案。而且,我注意到了一些事情就像我的代码中的评论一样,我可以在applicationDidFinishLaunching函数中访问我想要的内容,但不能在外部访问。当我没有这个功能时,我正在制作副本或其他东西吗?我该怎么做才能访问我的“donnees”表?

我是可可编码的初学者所以请告诉我,我做错了。

(请放纵我的英语:-)我不是双语了^^')

修改

我的 afficher 功能在开始时看起来像这样。我用XMLParser将解析后的数组作为参数调用它。我是sur它会工作但是......

-(void) afficher:(NSMutableArray *)array
{
    NSLog(@"%@", array);  //returns the array sent by XMLParser.
    [viewController.donnees addObjectsFormArray:array];
    NSLog(@"%@", viewController.donnees);  //returns null.
}

这很奇怪,就像唐纳甚至没有分配和初始化......

3 个答案:

答案 0 :(得分:0)

我建议设置一个断点,以便在viewController ivar改变时停止程序;这样做:

  1. 在appDelegate中设置断点,然后调试程序;

  2. 当程序在appDelegate中停止时,在gdb控制台中执行以下命令:

      (gdb) watch -location self->viewController
    
  3. 继续调试。

  4. 现在,每次viewController设置一个值,程序就会停止,这样你就可以检查是谁试图将它设置为nil和为什么。

    OLD:

    问题可能在于您描述为“我将包含解析文件的数组从XMLParser发送到Appdelegate”的步骤。

    事实上,似乎当您的应用开始时,即在解析之前,viewController.donnees已定义;解析后,它为null。你显然在两者之间做错了。

    可能是parserDidEndDocument方法尝试以错误的方式设置donnees ivar。如果没有更多代码,就无法进一步提供帮助,但我希望这一提示可以指导您朝着正确的方向发展。

答案 1 :(得分:0)

你确定 viewController 不是nil吗?好的,那不太可能。那么你确定 donnees 数组不是nil且它是NSMutableArray,而不是NSArray吗?

而且,顺便说一下,你可以从任何地方访问appDelegate中的属性。我不喜欢这个解决方案,只是为了澄清这个问题。在任何课程中,你都可以这样做:

#include "YourAppDelegate.h"

- (void)someMethod {
    YourAppDelegate *yourDelegate = [[UIApplication sharedApplication] delegate];
    yourDelegate.donnees = self.anotherArray;
}

当然, donnees 应该是这种情况下的财产。干杯!

答案 2 :(得分:-1)

参考:

-(void) rar:(NSMutableArray *)array
{
    NSLog(@"%@", array);  //returns the array sent by XMLParser.
    [viewController.donnees addObjectsFormArray:array];
    NSLog(@"%@", viewController.donnees);  //returns null.
}