Передача NSDictionary в ViewController из AppDelegate - PullRequest
0 голосов
/ 30 октября 2009

Это связано с вопросом, который я задавал ранее, но на исходный вопрос был дан ответ. Надеюсь, что можно открыть новый вопрос, если нет, не стесняйтесь удалить его.

Я пытаюсь создать простое приложение для iPhone, используя таблицы и панель вкладок. Все представления одинаковы программно, за исключением заголовка и вида данных, которые необходимо отобразить. За исключением того, что все они ведут себя одинаково.

В настоящее время код в моем AppDelegate управляет распределением контроллеров представления по различным вкладкам и соответственно устанавливает заголовок. Однако я не могу понять, как передать определенный массив объектов (каждый массив отличается для каждой вкладки) каждому распределенному контроллеру представления, чтобы он использовался табличным представлением.

Надеюсь, ты сможешь мне помочь. Мой код следует ниже:

AppDelegate.h

#import <UIKit/UIKit.h>

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
  UIWindow *window;
  UITabBarController *tabBarController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

@end

AppDelegate.m

#import "RootViewController.h"
#import "MyAppDelegate.h"

@implementation MyAppDelegate.h

@synthesize window, tabBarController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
  NSDictionary *row1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"1", @"Id", 
                    @"My Name", @"Name", 
                    @"My Type", @"Type",
                    @"My Meta", @"Meta",
                    @"My Excerpt Text", @"Excerpt",
                    @"My Body Text", @"Body",
                    @"icon.jpg", @"Icon", 
                    @"image.jpg", @"Image", nil];

  NSArray *array = [[NSArray alloc] initWithObjects:row1, nil];
  self.events = array;

  NSArray *tableControllersConfig = [NSArray arrayWithObjects:
                                 [NSDictionary dictionaryWithObjectsAndKeys:@"test1", @"DataSource", @"Title of the Tableview", @"Title", @"icon.png", @"Icon", nil],

  NSMutableArray *tableControllers = [NSMutableArray array];
  for (NSDictionary *configDict in tableControllersConfig) {
    RootViewController *controller = [[RootViewController alloc] initWithNibName:@"TableView" bundle:nil];
    controller.tableView.delegate = controller;
    controller.title = [configDict valueForKey:@"Title"];
    controller.tabBarItem.image = [UIImage imageNamed: [configDict valueForKey:@"Icon"]];
    [tableControllers addObject:controller];
    [controller release];
  }

  self.tabBarController.viewControllers = [NSArray arrayWithArray:tableControllers];
  [window addSubview:tabBarController.view];
  [row1 release];
  [array release];
}

- (void)dealloc {
    [tabBarController release];
    [window release];
    [super dealloc];
}
@end

RootViewController реализует протокол UITableViewDataSource.

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Если ваш «RootViewController» является источником данных tableView (реализует протокол UITableViewDataSource)

Создать NSArray ivar в классе RootViewController, скажем, "tableDataArray",

Создайте новый метод init, который будет включать массив, который будет сохранен в этом ivar:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil tableDataSource:(NSArray*)tableData {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    // Custom initialization
    tableDataArray = [tableData retain];

}
return self;

}

Используйте tableDataArray в методах источника данных tableView.

Затем, когда вы создаете RootViewController в вашем цикле, вы можете установить tableDataArray с помощью нового метода init, и вы можете заполнить каждое представление таблицы различным массивом.

надеюсь, это поможет

0 голосов
/ 30 октября 2009

Ответ зависит от вашего дизайна.

Если данные, с которыми вы работаете, остаются неизменными при запуске, вы должны сохранить эти данные в контроллере представления, поскольку они являются частью базовой конфигурации табличных представлений.

Если данные эволюционируют со временем, вам следует поместить их в делегат приложения, а затем использовать пользовательский подкласс контроллера представления, который имеет указатель на эти данные. Посмотрите на один из проектов шаблонов в XCode, которые используют основные данные. Отношения между классами такие же, как и вам, но вы бы использовали массив вместо контекста управляемого объекта.

...