Передача массива между контроллерами представления? - PullRequest
0 голосов
/ 18 декабря 2010

Мне действительно нужна дополнительная помощь!

Я пытаюсь передать массив из одного контроллера представления в другой.Я думаю, что последний является дочерним контроллером представления?

Мой код выглядит следующим образом:

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

PopoverViewController.m:

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

@implementation PopoverContentViewController

@synthesize countProductCodes;
...

Я многое вырезал, но я знаю по загрузке NSLog, что яполучить данные и т.д., но я не могу передать массив countProductCode в массив PopoverViewController's countProductCodes.

Я продолжаю получать

"Доступ к неизвестному" setCountProductCodes: 'метод класса "

ошибки.

Это может быть чем-то действительно глупым, что я делаю, но это сводит меня с ума!

Может кто-нибудь помочь, пожалуйста?

Спасибо, Джеймс

Ответы [ 4 ]

6 голосов
/ 19 декабря 2010

Дорогой Джеймс, Я думаю, что вы хотели бы поближе взглянуть на парадигму Model-View-Controller. В своем приложении вы пытаетесь реализовать своего рода «суперкласс». Позвольте мне объяснить, что это значит:

В вашем классе MainViewController, который явно является контроллером, есть также некоторая часть реализованной модели. Это плохая идея, но очень распространенная в начале. Может быть, я неправильно понял ваш дизайн, но вот как я бы его реализовал:

Модель Я бы реализовал правильный объект модели, который в вашем случае мог бы быть таким же простым, как пользовательский подкласс NSObject с NSMutableArray в качестве свойства. Кроме того, в этой модели будут реализованы методы извлечения данных из Интернета. Это правильно: сделать сеть в модели. Вам нужно иметь такие методы, как - (void) refreshProductCode, которые вы будете вызывать с вашего контроллера. Если вы хотите по-настоящему поработать, используйте NSOperation для инкапсуляции загрузки (тогда вы будете использовать синхронный вариант NSURLConnection, потому что сама операция уже выполняется асинхронно). Тогда было бы хорошо, если бы вы анализировали строка JSON занимает больше времени, также это выполняется в фоновом режиме, и ваш пользовательский интерфейс будет реагировать.

Итак, теперь модель загружает ваши вещи - отлично, но как я узнаю, когда это будет сделано? Ну, вы бы опубликовать уведомление от модели, как только это будет сделано. Что делать, если загрузка не удалась? Вы догадались, правильно: опубликуйте уведомление, что это не удалось.

Контроллер Контроллер, который должен отображать данные из модели, сначала должен получить объект модели. В этом случае объект модели является свойством вашего AppController. Контроллер затем имеет свойство для этого объекта модели и сохраняет его, чтобы объект модели не исчезал, пока контроллер живет. Затем контроллер также регистрирует уведомления модели. Так как же тогда будет работать типичная загрузка?

  1. Получить экземпляр объекта модели
  2. вызов -(void) refreshProductCode на модельном объекте
  3. отображать счетчик сетевой активности в строке состояния и ждать уведомлений
  4. когда пришло уведомление, при успешном обновлении пользовательского интерфейса и при неудаче перезапустите загрузку или отобразите примечание для пользователя. Также отключите счетчик сетевой активности.

Как вы перетасовываете данные между контроллерами представления? Контроллеры представления должны работать немного как мафия: каждый контроллер представления работает на основе необходимости знать. Например, если вы хотите, чтобы контроллер представления отображал детали вашего продукта, вы не передадите модель со всеми вашими продуктами в контроллер. Вместо этого у вас будет переменная экземпляра в контроллере подробного представления, содержащая только один объект модели продукта, который имеет всю информацию, такую ​​как текст описания, фотография и т. Д. Крутая вещь в том, что если вы когда-нибудь захотите снова отобразить информацию о продукте в своем приложении, вы может повторно использовать этот контроллер представления, поскольку все, что ему нужно, это объект модели продукта, чтобы выполнить свою работу.

2 голосов
/ 18 декабря 2010

В вашем коде:

PopoverContentViewController.countProductCodes = countProductCode;

должно быть:

popoverContentViewController.countProductCodes = countProductCode;

Ваше имя экземпляра должно отличаться от имени класса.

1 голос
/ 18 декабря 2010

В классе mainViewController в следующем методе

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

вы получаете доступ к "countProductCodes", используя имя класса.Вы должны получить доступ, используя его объект.

как

PopoverContentViewController *obj = [[PopoverContentViewController alloc] init];
obj.countProductCodes = countProductCodes;
0 голосов
/ 19 октября 2012

In MainViewController.h :

+(NSMutableArray)arrayRes;

В MainViewController.m

+(NSMutableArray)arrayRes{
return countProductCode;
}

выполнить любые изменения кода в массиве countProductCode, как обычно

В PopoverViewController.m объявить @class MainViewController; и в viewDidLoad

NSMutableArray *newArray;
newArray = [MainViewController arrayRes];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...