2010-03-03 75 views
0

我想访问一个NSMutableArray,它是我的AppDelegate类的数据成员。它是在实现中合成的,并且是一个具有“名称”NSString数据成员的自定义类的数组。访问委托中的局部变量的正确方法是什么?

我目前使用它来填充表视图(子视图)是这样的:

cell.textLabel.text = [[[delegate contentArray] objectAtIndex:indexPath.row] name]; 

这工作,但我得到一个警告:

warning: no '-contentArray' method found 

它不会为编译:

cell.textLabel.text = [[delegate.contentArray objectAtIndex:indexPath.row] name]; 

我得到这个在这种情况下:

error: request for member 'contentArray' in something not a structure or union 

在委托中访问数组的正确方法是什么?

更新: 要声明delegate,表中的视图控制器头文件,我包括@class MainAppDelegate;并在@interface我声明的数据成员MainAppDelegate *delegate;。在表视图控制器的@implementation我做@synthesize delegate;

+0

什么是委托?它是如何声明的? – Chuck 2010-03-03 23:33:04

+0

我更新了帖子。我使用主AppDelegate类类型来定义从视图控制器类中委托的代理。 – 2010-03-04 01:48:31

+0

局部变量只在方法的范围内,而类没有“数据成员”。我相信你正在考虑一个实例变量,它通过一个属性暴露出来。 – 2010-03-04 02:44:30

回答

1

我想我解决了它。 MainAppDelegate.h头文件未导入到表视图控制器的.m文件中。我想这对我来说没有任何意义,因为主AppDelegate.h文件和表视图的ViewController.h文件都可以相互导入。

+0

这不是什么大事。 MainAppDelegate需要了解ViewController,ViewController需要了解MainAppDelegate。 有点复杂的循环依赖,但这是#import的美丽。 – alesplin 2010-03-04 18:19:22

0

您必须将委托转换为正确的类型。像这样:

cell.textLabel.text = [[[(MyAppDelegate*) delegate contentArray] 
    objectAtIndex:indexPath.row] name] 
1

要声明delegate,表中的视图控制器头文件,我包括@class MainAppDelegate;并在@interface我声明[N实例变量] MainAppDelegate *delegate;。在表视图控制器的@implementation我做@synthesize delegate;

因此,您已经预先声明类名称MainAppDelegate并用它来声明一个实例变量。既然你是@合成财产,我想你也宣布了其中之一。

我目前使用它来填充表视图(子视图)是这样的:

cell.textLabel.text = [[[delegate contentArray] objectAtIndex:indexPath.row] name]; 

这工作,但我得到一个警告:

warning: no '-contentArray' method found 

它将不编译为:

cell.textLabel.text = [[delegate.contentArray objectAtIndex:indexPath.row] name]; 

我得到这个在这种情况下:

error: request for member 'contentArray' in something not a structure or union 

这是因为编译器不知道有什么方法或属性delegate了。你已经声明了它的类的名字,但是编译器不知道关于它的其他信息,因为你没有提供该类的@interface

解决方案是将#import委托类的头文件放入表视图控制器类的实现文件中,可能在表视图控制器类自己的头后立即生成。

此外,我怀疑该数组更适当地属于表视图控制器而不是应用程序委托,但我对Cocoa Touch肯定不够了解。

+0

这有助于我理解*为什么*缺少头文件导致问题。我更习惯于C/C++,其中一个未声明的类通过#import只会导致错误,而不是警告。至于contentArray的位置,我的理解是,数据的最佳位置在AppDelegate中,因为多个视图可以通过AppDelegate一次访问数据。我见过的每个例子都是这样做的。我相信还有其他的方法。 – 2010-03-04 04:48:57

+0

如果您没有用'@ class'向前声明类名,那么您在Objective-C中也会发生错误。使用该声明(适用于使用声明类的类的头文件中),编译器至少知道这是一个类的名称;它只是不知道关于该类的任何其他信息,直到你给它一个“@接口”为止。 – 2010-03-04 06:45:49

相关问题