Использование plist в DetailView - PullRequest
1 голос
/ 14 декабря 2010

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

Я посмотрел некоторые источники, такие как iCodeBlog, но они не очень хорошо объясняют получение и сохранение.Может быть, вы, люди, также можете дать ссылку на некоторые ссылки, которые описывают это лучше.

Вот список, который я пробовал.У каждого из элементов (Orange, Apple) есть данные, которые я хочу отобразить в моем detailView.Я в основном хочу отобразить показанные данные.

alt text

Ответы [ 4 ]

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

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

DetailViewController.h

#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController {
    UILabel *description;
    UIImageView *imageView;
    NSString *selectedItem;
}
@property (nonatomic, retain) IBOutlet UILabel *description;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, copy) NSString *selectedItem;
@end

DetailViewController.m

#import "DetailViewController.h"
@implementation DetailViewController
@synthesize description, imageView, selectedItem;

- (void)viewDidLoad {
    NSDictionary *details = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Details" ofType:@"plist"]];
    details = [details objectForKey:self.selectedItem];
    self.description.text = [details objectForKey:@"description"];
    self.imageView.image = [UIImage imageNamed:[details objectForKey:@"image"]];
}
@end

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

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

Списки действительно полезны во многих случаях:

+ (NSMutableDictionary*) containerDictionary {

    NSString *path = [[NSBundle mainBundle] bundlePath];
    NSString *finalPath = [path stringByAppendingPathComponent:@"ContainerGraphics.plist"];
    NSMutableDictionary *plistData = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];

    return plistData;

}

Это загружает файл plist (список свойств) с именем "ContainerGraphics.plist" из пакета моих приложений.

Файл plistна самом деле просто файл XML.Вы можете создать его в XCode, выбрав «новый файл» -> «ресурс» -> «Список свойств».

Вы действительно не говорите, что вы не понимаете, так что если есть что-тоКонкретное, что вам трудно понять, пожалуйста, уточните:)

РЕДАКТИРОВАТЬ:

С размещенным вами списком рассылки используйте мой подход, описанный выше, чтобы «загрузить» файл списков рассылки.Тогда это NSDictionary NSDictionaries ..

Итак, чтобы перейти к словарю "Apple", вы идете:

NSDictionary *appleDictionary = [plistData objectForKey:@"Apple"];

Что означает что-то вместе - перейдите в список и получите "Apple""словарь.

Теперь, чтобы получить значения изображения и описания, вы бы пошли:

NSString *imagePath = [appleDictionary objectForKey:@"image"];
NSString *descriptionString = [appleDictionary objectForKey:@"description"];

Это в значительной степени то, что есть.

Если у вас есть tableView, который должен быть заполнен этими данными, есть ловушка!Данные внутри NSDictionary не имеют порядка.Так что вы не можете просто ссылаться на [словарь objectAtIndex: indexPath.row], как если бы вы делали это с массивом данных для tableView.

Затем вы сначала получаете plistData, как в моем первом примере.,(сделать это в viewDidLoad).Затем вы извлекаете все ключи из словаря plistData - обратите внимание, что «верхний словарь специфичен», Apple, «Orange» и т. Д., А не значения, которые вы хотите жестко закодировать в своем приложении.Но словари внутри этих словарей являются общими, изображение, описание…

Итак:

NSArray *allKeys = [plistData allKeys];

массив allKey теперь содержит ключи (Apple, Orange и т. Д.) Для доступа к NSDictionariesв plistData.

В методе cellForRowAtIndexPath вы можете перейти:

NSDictionary *dictionaryForCurrentCell = [plistData objectForKey:[allKeys objectAtIndex:indexPath.row]];
[cell.textLabel setText:[dictionaryForCurrentCell objectForKey:@"image"]];
[cell.detailLabel setText:[dictionaryForCurrentCell objectForKey:@"description"]];

Надеюсь, это поможет:)

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

Передайте NSString в подробный вид и загрузите элемент на основе строки NSSt. Это может быть конкретное имя словаря или элемент в массиве.

newDetailViewController.currentItem = @"Array1";

и в моем подробном представлении определите:

.h
    NSString *currentItem;
    @property(nonatomic,retain) NSString *currentItem;
.m
    @synthesize currentItem;

Теперь currentItem в вашем контроллере detailView будет "Array1", поскольку именно это мы и передали ему.

Все зависит от того, как настроен ваш plist, используете ли вы NSArray, NSDictionary?

Существует множество способов использовать это:

    NSString *current = [NSString stringWithFormat:@"%@/%@",appDocsPath,currentItem];
    NSMutableDictionary* dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:current] autorelease];

РЕДАКТИРОВАТЬ ИЗ ВОПРОСА: Используя пример выше:

aLabel.text = [dict objectForKey@"description"];
0 голосов
/ 14 декабря 2010

Создайте массив в листе с количеством элементов, равным количеству строк.Создайте строку с именем description и строку с именем image в каждом элементе.Получить номер выбранной строки в методе didSelectRowAtIndex:.Сохраните словарь в NSDictionary

[myDictionary initWithDictionary:[myArray objectAtIndex:indexPath.row]]

Затем получите imagestring и строку описания, вызвав

[myDictionary objectForKey:@"image"]

и передать эти строки в подробный вид.

...