2010-03-03 70 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

相關問題