2010-12-18 62 views
0

我真的需要更多的帮助!视图控制器之间传递数组?

我想从一个视图控制器传递数组到另一个视图控制器。我认为后者是一个'孩子'视图控制器?

我的代码如下:

MainViewController.h:

#import <UIKit/UIKit.h> 
#import <AudioToolbox/AudioToolbox.h> 
#import <AVFoundation/AVFoundation.h> 

@interface HelloWorldIOS4ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, AVAudioPlayerDelegate> { 
    NSMutableArray *countProductCode; 
    UIPopoverController *detailViewPopover; 
} 

@property (nonatomic, retain) NSMutableArray *countProductCode; 

@property (nonatomic, retain) UIPopoverController *detailViewPopover; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
... 
@end 

MainViewController.m

#import "HelloWorldIOS4ViewController.h" 
#import "JSON.h" 
#import "PopoverContentViewController.h" 

@implementation HelloWorldIOS4ViewController 

@synthesize detailViewPopover; 
@synthesize countProductCode; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    NSDictionary *results = [jsonString JSONValue]; 
    NSLog(@"RETURN: %@", results); 

    [countProductCode removeAllObjects]; 

    NSArray *products = [results objectForKey:@"items"]; 

    for (NSDictionary *row in products) 
    { 
     NSString *code = [row objectForKey:@"ic"]; 
     [countProductCode addObject:code]; 
    } 

    PopoverContentViewController.countProductCodes = countProductCode; 
}  

PopoverViewController.h:

@interface PopoverContentViewController : UITableViewController { 
    NSMutableArray *countProductCodes; 
} 
@property (nonatomic, retain) NSMutableArray *countProductCodes; 
@end 

PopoverViewControl ler.m:

#import "PopoverContentViewController.h" 
#import "HelloWorldIOS4ViewController.h" 

@implementation PopoverContentViewController 

@synthesize countProductCodes; 
... 

我已经削减了很多,但我从的NSLog的周围点缀的负载知道我取回数据等,但我不能数组countProductCode传递给PopoverViewController'scountProductCodes阵列。

我不断收到

“访问未知 'setCountProductCodes:' 类方法”

错误。

这可能真的很愚蠢,我正在做,但它让我疯了!

任何人都可以帮忙吗?

感谢 詹姆斯

回答

2

在您的代码:

PopoverContentViewController.countProductCodes = countProductCode; 

应该是:

popoverContentViewController.countProductCodes = countProductCode; 

你的实例名应与类名不同。

+0

这可能是真实的,但并没有解决父母和孩子视图控制器之间的强耦合的根本问题。 – GorillaPatch 2010-12-22 11:11:24

1

在mainViewController类,在下面的方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

您正在访问的 “countProductCodes” 使用的类名。您应该使用其对象进行访问。

PopoverContentViewController *obj = [[PopoverContentViewController alloc] init]; 
obj.countProductCodes = countProductCodes; 
+0

好的,所以这会将我的数组传递给PopoverContentViewController类的对象(一个实例?)。 - 任何想法如何让PopoverContentViewController然后显示我的数组作为表视图?您的帮助非常感谢 – 2010-12-18 16:11:30

+0

您可以在PopoverContentViewController类中访问该数组,如“self.countProductCodes” – Satya 2010-12-20 07:07:15

6

亲爱的詹姆斯, 我想你想有在模型 - 视图 - 控制器模式一探究竟。在你的应用程序中,你试图实现某种“超类”。让我解释一下这是什么意思:

在你的MainViewController类中,这显然是一个控制器,还有一部分模型被实现。这是一个坏主意,但是一开始就很常见。也许我误解你的设计,但这里是我将如何实现它:

示范我会实现一个合适的模型对象,这可能是你的情况一样容易定制NSObject子类有NSMutableArray作为属性。此外,这种模式将具有从互联网上检索数据的方法。这是正确的:在模型中进行联网。你将不得不有你想要从你的控制器调用的方法,如- (void) refreshProductCode。如果你想变得很花哨,用NSOperation来封装下载(然后你会使用NSURLConnection的同步变体,因为操作本身已经被异步执行了),那么如果你解析JSON字符串需要的是好的东西更长,这也是在后台执行的,你的用户界面将保持响应。

所以现在模型正在下载你的东西 - 很好,但我怎么知道它什么时候完成?那么你会在模型完成后发布一个通知。如果下载失败会怎样?你猜对了:发布通知失败。

控制器需要显示模型数据的控制器首先获取模型对象。在这种情况下,模型对象是您的AppController上的一个属性。然后控制器拥有该模型对象的属性并保留该属性,以便模型对象在控制器处于活动状态时不会消失。控制器然后也注册模型的通知。那么典型的下载是如何工作的呢?

  1. 模型对象上获取的模型对象的实例
  2. 通话-(void) refreshProductCode在状态栏中
  3. 显示网络活动微调,并等待通知
  4. 时通知进来,成功刷新UI并在失败时重新启动下载或向用户显示备注。还要禁用网络活动微调器。

如何在视图控制器之间混洗数据?视图控制器应该像黑手党一样操作:每个视图控制器都在需要知道的基础上工作。例如,如果您希望视图控制器显示产品的详细信息,则不会将所有产品的模型传递给控制器​​。相反,您将在只有一个产品模型对象的详细视图控制器上拥有一个实例变量,其中包含描述文本,照片等所有信息。最酷的是如果您想再次在您的应用中显示产品信息,那么您可以重用该视图控制器,因为它需要的只是一个产品模型对象来完成其工作。

0

MainViewController.h

+(NSMutableArray)arrayRes; 

MainViewController.m

+(NSMutableArray)arrayRes{ 
return countProductCode; 
} 

执行任何countProductCode阵列上的代码变化通常

PopoverViewController。米 声明@class MainViewController;viewDidLoad中

NSMutableArray *newArray; 
newArray = [MainViewController arrayRes];