2012-01-25 44 views
0

我有一個DetailViewController和一個消息類(這是一個TableViewController類)。我解析了第一類中的一些Web信息,並希望在第二課中使用它們中的一些值。當我在這裏尋找周圍和谷歌幾個haurs,現在我想我需要在我的第二類中定義一些extern變量,並初始化它們與第一類的對象..我嘗試了幾種方法,但都失敗了。是否可以使用extern訪問Objective c中其他類的變量?

在我的第一CLAS我有一個NSMutableArray變量稱爲messID,在第二類我這樣做:

#import DetailViewController 
. 
. 
extern NSMutableArray *myArray; 
DetailViewController *myObject; 
myArray=myObject.messID; 

但我得到了以下錯誤:

Undefined symbols for architecture i386: 
    "_myArray", referenced from: 
     -[messages tableView:cellForRowAtIndexPath:] in messages.o 

我在做什麼錯我可以做什麼請任何一個幫助嗎?..

編輯 我輸入了需要的類, 在第二類的.h文件我用這個:

@interface messages : UITableViewController{ 

     BNT_1DetailViewController *myObject; 
} 
@property(retain, nonatomic)BNT_1DetailViewController *myObject; 

而且其.m文件是:

...

@sysnthesize myObject; 


    viewDidLoad{ 
    myObject=[[BNT_1DetailViewController alloc]init];} 
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
    #warning Incomplete method implementation. 
     // Return the number of rows in the section. 
     return myObject.mesID.count; 
     } 

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"Cell"; 
     //extern NSMutableArray *messID; 


     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     }NSLog(@" -> %@",myObject.mesID); 
      cell.textLabel.text= [myObject.mesID objectAtIndex:indexPath.row];  
      // Configure the cell... 
     // [tableView reloadData]; 
     return cell; 

     } 

回答

3

我不會用extern因爲你是誰試圖這樣做,這意味着您還要定義一些全局變量(並嘗試從使用關鍵字extern的文件中訪問它們)。對於記錄,無論如何,你得到的錯誤取決於extern只是一個不定義你的對象的指令 - 它只是將它們聲明爲在其他地方定義。因此,您應該在某些.m文件中添加對象的正確定義,而不會忘記在某個時間點初始化它們,以便它們指向有意義的對象。

一個更好的方法來做你想做的事情是通過你的第一類中聲明的公共屬性允許從第二類訪問NSMutableArray

這方面的一個例子是:

@interface DetailViewController : ... { 

    NSMutableArray* array; 
} 
@property (...) NSMutableArray* array; 
@end 

@interface Messages : ... { 
    DetailViewController* detailViewController; 
} 
... 
@end 

@implementation Messages; 
... 
... detailViewController.array... 
... 
@end 

這個解決方案是更好,因爲它不使用全局變量,並具有更好的封裝。實際上,你可以嘗試和定義一個模型(比如在model-view-controller中),它包含你所有的數據,並讓它們在所有需要它的控制器之間共享。這將是一個更好的方法。

編輯:如何一個控制器連接到另一個...

說,在某些時候你創建一個新的控制器:現在

messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil]; 

detailViewController需要從messages,檢索它的數據,是創建它的控制器。你有幾個選擇來做到這一點。一個容易被具有messageDetail鏈接到messages公共財產:

@interface messageDetail : ... { 
     .... 
    } 
    @property (nonatomic, retain) messages* messagesRef; 
    ... 
    @end 

(別忘了messageDetail實現合成該屬性)。

然後,當你實例messageDetail,你只需做到這一點:

messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil]; 
detailViewController.messagesRef = self; 

一旦你這樣做,你的detailViewController將有一個指針,正確初始化,以指向另一個控制器。

如果你的其他控制器暴露(如我上面解釋的)與NSArray屬性,你的完成。

+0

你的意思是不需要extern命名空間? –

+0

請參閱我對「extern」關鍵字的編輯。你不需要它,如果你想讓你的DetailController成爲一個全局對象,你可以使用它,但我懷疑它。你的代碼在任何情況下都缺少實際定義'extern'關鍵字引用的對象的部分。 – sergio

+0

在第一個類中,我用來自JSON對象的一些值初始化數組,並且我想在第二個類中使用它們。我試過這個,但結果與之前一樣.. –