Доступ к данным из массива диктионов, содержащих массив - PullRequest
1 голос
/ 21 июля 2010

Я немного озадачен и надеюсь, что кто-нибудь сможет мне помочь. У меня есть список, который представляет собой массив словарей. Я пытаюсь прочитать это в таблицу. Плист выглядит так:

<array>
    <dict>
        <key>sectionTitle</key>
        <string>A</string>
        <key>rowData</key>
        <array>
            <dict>
                <key>Title</key>
                <string>Albert Author</string>
                <key>dText</key>
                <string>text for detail view</string>
            </dict>
            <dict>
                <key>Title</key>
                <string>Antony Author</string>
                <key>dText</key>
                <string>Descriptive text for detail view</string>
            </dict>
            <dict>
                <key>Title</key>
                <string>Azerifiel Author</string>
                <key>dText</key>
                <string>Text for detail view</string>
            </dict>
        </array>
    </dict>
    <dict>
        <key>sectionTitle</key>
        <string>B</string>
        <key>rowData</key>
        <array>
            <dict>
                <key>Title</key>
                <string>Barny Author</string>
                <key>dText</key>
                <string>text for detail view</string>
            </dict>
            <dict>
                <key>Title</key>
                <string>Bazle Author</string>
                <key>dText</key>
                <string>text for detail view</string>
            </dict>
            <dict>
                <key>Title</key>
                <string>Bruno Author</string>
                <key>dText</key>
                <string>text for detail view</string>
            </dict>
        </array>
    </dict>
</array>

Моя проблема заключается в следующем: я могу создать аналогичную структуру за исключением того, что массивы заполняют табличное представление, но я не могу заставить приведенный выше код работать с массивами. Я не уверен, как обращаться с массивами в коде, но я не могу избавиться от них, потому что я хочу, чтобы финальная таблица была проиндексирована и секционирована. Вот код из моего метода viewDidLoad.

- (void)viewDidLoad {
    [super viewDidLoad];

    // Path to the plist (in the application bundle)
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Tester" ofType:@"plist"];

    // Build the array from the plist  
    NSArray *dictArray = [[NSArray alloc] initWithContentsOfFile:path];
    NSMutableArray *mutableArray = [[NSMutableArray alloc] init];

    for(NSDictionary *dict in dictArray)
    {
        DictModel *term = [[DictModel alloc] init];
        term.sectionTitle = [dict objectForKey:@"sectionTitle"];
        term.Title = [dict objectForKey:@"Title"];
        term.dText = [dict objectForKey:@"dText"];
        [mutableArray addObject:term];
        [term release];
    }

    tableDataSource = [[NSArray alloc] initWithArray:mutableArray];
    [mutableArray release];
    [dictArray release];
    [super viewDidLoad];
}

У меня есть отдельный класс под названием DictModel, который выглядит так:

@interface DictModel : NSObject {
    NSString *sectionTitle;
    NSString *Title;
    NSString *dText;
}

@property(nonatomic, retain) NSString *sectionTitle;
@property(nonatomic,retain) NSString *Title;
@property(nonatomic, retain) NSString *dText;

@end

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

Вот моя ячейка для метода строк. Это может быть, где проблема с отображением. Я добавил это по просьбе коментатора:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                   reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell.
DictModel *term = [tableDataSource objectAtIndex:indexPath.row];
cell.textLabel.text = term.Title;
cell.detailTextLabel.text = term.dText;

return cell;

}

1 Ответ

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

Я решил эту проблему некоторое время назад с помощью хороших людей здесь и на форумах Mac Dev.Я думал, что вернусь и поделюсь тем, что я узнал, для всех, кто не знаком с iphone Dev (как я) и борется с этой проблемой.

ОБРАТИТЕ ВНИМАНИЕ: Нижеследующее написано в меру моего понимания того, что я узнал, пытаясь решить эту проблему, поэтому в моем описании может быть несколько технических ошибок.Если вы заметите что-нибудь, я был бы рад, если бы вы указали на них.Я занимаюсь разработкой для iphone, потому что хочу научиться программировать, поэтому исправления приветствуются!

Во-первых, My Plist по-прежнему выглядит так же.Это массив словарей.Это действительно гораздо более простой способ сделать то, что я хотел сделать, чем использовать словарь массивов, с которого я изначально и начал.Причина, по которой код в моем исходном сообщении выглядит так плохо, заключается в том, что он основан на моем понимании того, как заполнять таблицу с помощью словаря массивов, что является неуклюжим.

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

@interface MyTableViewController : UITableViewController 
{
IBOutlet UITableView *myTableView;
MyDetailViewController *myDetailViewController;
NSArray *tableDataSource;

}

@property (nonatomic, retain) myDetailViewController *myDetailViewController;
@property (nonatomic, retain) NSArray *tableDataSource;

@end

Все довольно самоочевидно.У меня есть выход для просмотра таблицы и таблицы детализации.У меня также есть массив, в который я буду читать мой .plist в таблицу.

Переход к моему файлу .m, который выглядит следующим образом:

@implementation TableViewController
@synthesize myDetailViewController;
@synthesize tableDataSource; 

- (void)viewDidLoad {
[super viewDidLoad];

self.title = NSLocalizedString(@"Tester", @"Browse by name");

// Path to the plist (in the application bundle)
NSString *path = [[NSBundle mainBundle] pathForResource:@"Testers" ofType:@"plist"];

// Retrieve the plist's root element array  
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];

// Assign the plist array to my instance variable
self.tableDataSource = array;
[array release];
} 

ПодшипникИсходный вопрос, я думаю, важная часть, на которой нужно сконцентрироваться - это метод viewDidLoad.По сути, после супер я назначаю имя в верхней части табличного представления.Затем я создаю строку под названием «путь», которая составлена ​​из моего .plist под названием «Тестеры».Я создаю массив под названием «массив» и инициализирую его содержимым строки, которую я только что создал, под названием «путь».Наконец, я назначаю свой массив .plist моей переменной экземпляра NSArray 'tableDataSource'.Это намного проще, чем моя первоначальная попытка.Во-первых, мне больше не нужна отдельная модель классов.

Следующая ключевая вещь - это мой cellForRowAtIndexPathMethod, который теперь выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                   reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell.
NSDictionary *sectionDictionary = [tableDataSource objectAtIndex:indexPath.section];
NSArray *sectionRowArray = [sectionDictionary objectForKey:@"rowData"];
NSDictionary *rowDictionary = [sectionRowArray objectAtIndex:indexPath.row];
cell.textLabel.text = [rowDictionary objectForKey:@"Title"];
return cell;
}

Это почтиТо же, что и раньше, за исключением того, что средства, с помощью которых настроена ячейка, изменились, чтобы приспособиться к моему новому способу чтения данных из .plist.Так что я больше не имею в виду модель Dict."rowData" и "Title" - это ключи в моем списке (см. очень верхнюю часть страницы).«rowData» - это ключ для каждого раздела, а «Title» - это текст, который виден в ячейке во время выполнения скрипта.

Другой ключевой бит информации - это метод didSelectRowAtIndexPath, который определяет, что будет передано.в подробный вид, когда ячейка выбрана.Это выглядит так:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the dictionary of the selected data source.
NSDictionary *dictionary = [[[self.tableDataSource objectAtIndex:indexPath.section]objectForKey:@"rowData"] objectAtIndex:indexPath.row];

MyDetailViewController *controller = [[MYDetailViewController alloc] initWithNibName:@"MyDetailView" bundle:[NSBundle mainBundle]]; 

controller.title = [dictionary objectForKey:@"Title"];
controller.dText = [dictionary objectForKey:@"dText"];

[self.navigationController pushViewController:controller animated:YES];

[controller release];

}

Я начинаю с получения словаря для источника данных таблицы, который был назначен моей переменной экземпляра tableDataSource в моем методе viewDidLoad.Затем я сообщаю своему контроллеру подробностей вида, что он есть в основном пакете, и говорю ему, что при нажатии подробного представления он должен поместить все, что находится в позиции клавиши «Заголовок», в качестве заголовка этого конкретного экземпляра подробного представления и что ондолжен заполнить TextView в этом кончике текстом в .plist с ключом "dText".

Ну, вот и все.У меня это работало нормально, хотя я не могу поклясться, что это правильный способ сделать это.Благодаря людям, которые помогли мне получить его, в конце концов, я поднялся на еще один холм!

Надеюсь, это пригодится кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...