0

我真的需要更多帮助!

我正在尝试将数组从一个视图控制器传递到另一个视图控制器。我认为后者是“儿童”视图控制器?

我的代码如下:

主视图控制器.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

主视图控制器.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

PopoverViewController.m:

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

@implementation PopoverContentViewController

@synthesize countProductCodes;
...

我已经删减了很多内容,但是我从大量 NSLog 的负载中知道我得到了数据等,但是我无法将数组传递countProductCodePopoverViewController's countProductCodes数组。

我不断得到

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

错误。

这可能是我正在做的非常愚蠢的事情,但它让我发疯!

有人可以帮忙吗?

谢谢詹姆斯

4

4 回答 4

6

亲爱的詹姆斯,我想你想仔细看看模型-视图-控制器范式。在您的应用程序中,您正在尝试实现某种“超类”。让我解释一下这意味着什么:

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

我将实现一个适当的模型对象的模型,在您的情况下,它可以像NSObject具有 aNSMutableArray作为属性的自定义子类一样简单。此外,该模型将实现从互联网上检索数据的方法。没错:在模型中做网络。您必须拥有- (void) refreshProductCode从控制器调用的方法。如果您想真正花哨,请使用 anNSOperation来封装下载(然后您将使用 的同步变体NSURLConnection,因为操作本身已经异步执行)如果您对 JSON 字符串的解析需要更长的时间,那将是一件好事,这也是在后台执行的,您的 UI 将保持响应。

所以现在模型正在下载你的东西——很好,但我怎么知道它什么时候完成?好吧,一旦完成,您将从模型中发布通知。如果下载失败怎么办?您猜对了:发布失败的通知。

控制器需要显示模型数据的控制器首先要获取模型对象。在这种情况下,模型对象是 AppController 上的一个属性。然后控制器拥有这个模型对象的属性并保留它,这样模型对象就不会在控制器存在时消失。然后控制器还注册模型的通知。那么典型的下载如何工作呢?

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

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

于 2010-12-19T09:38:21.657 回答
2

在您的代码中:

PopoverContentViewController.countProductCodes = countProductCode;

应该:

popoverContentViewController.countProductCodes = countProductCode;

您的实例名称应该与类名称不同。

于 2010-12-18T15:06:31.300 回答
1

在 mainViewController 类中,在以下方法中

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

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

喜欢

PopoverContentViewController *obj = [[PopoverContentViewController alloc] init];
obj.countProductCodes = countProductCodes;
于 2010-12-18T15:11:50.543 回答
0

MainViewController.h中:

+(NSMutableArray)arrayRes;

MainViewController.m

+(NSMutableArray)arrayRes{
return countProductCode;
}

像往常一样对 countProductCode 数组执行任何代码更改

PopoverViewController.m 声明@class MainViewController;viewDidLoad

NSMutableArray *newArray;
newArray = [MainViewController arrayRes];
于 2012-10-19T10:38:01.833 回答