Отображение значений ключа .plist в алфавитном порядке в UITableView - PullRequest
3 голосов
/ 31 января 2011

У меня есть массив словарей в iOS .plist, структурированный примерно так:

<plist version="1.0">
<array>
<dict>
    <key>name</key>
    <string>Afghanistan</string>
    <key>government</key>
    <string>Islamic Republic</string>
    <key>population</key>
    <integer>29121286
    </integer>
</dict>
<dict>
    <key>name</key>
    <string>Albania</string>
    <key>government</key>
    <string>Emerging Democracy</string>
    <key>population</key>
    <integer>2986952</integer>
</dict>

Я пытаюсь загрузить <key>name</key> из каждого словаря в NSTableViewCell, а затем отобразить их все в алфавитном порядке в NSTableView, аналогично приложению Contacts в iOS.

Ниже приведены мои ViewControllers .h и .m. Сортировка работает, но я не могу загрузить результаты в TableViewCells?

FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController  <UITableViewDelegate,UITableViewDataSource>

{   
NSArray *sortedCountries;       
}

@property (nonatomic, retain) NSArray *sortedCountries;

@end

FirstViewController.m

#import "FirstViewController.h"

@implementation FirstViewController

@synthesize sortedCountries;



-(void)viewDidLoad  {

NSString *path = [[NSBundle mainBundle] pathForResource:@"countries"ofType:@"plist"];   
NSArray *countries = [NSArray arrayWithContentsOfFile:path];
NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease];
NSArray *sortedCountries = [[countries sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {

return 2;   
}

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

NSDictionary *country = [sortedCountries objectAtIndex:indexPath.row];
    NSString *countryName = [country objectForKey:@"name"];

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier] autorelease];

}

cell.textLabel.text = countryName;
return cell;        
} 

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;

}


- (void)dealloc {

[sortedCountries release];

[super dealloc];
}

@end

РЕДАКТИРОВАТЬ: Другой вопрос, связанный с этим здесь .

Ответы [ 4 ]

5 голосов
/ 31 января 2011

Добавьте ivar к @interface вашего контроллера представления в заголовочном файле:

@interface MyViewController : UITableViewController
{
    ...
    NSArray *sortedCountries;
}

Добавьте этот код (для чтения и сортировки списка по названию страны) в методе initWith... контроллера представления:

NSArray *countries = [NSArray arrayWithContentsOfFile: pathToPlist];
// Now the array holds NSDictionaries, sort 'em:
NSSortDescriptor *descriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease];
sortedCountries = [[countries sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]] retain];

Затем используйте следующий фрагмент для извлечения значений:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *country = [sortedCountries objectAtIndex:indexPath.row];
    NSString *countryName = [country objectForKey:@"name"];
    NSString *governmentType = [country objectForKey:@"government"];
    NSSInteger population = [[country objectForKey:@"population"] integerValue];
    // ... do something with countryName, governmentType, population
}

Не забудьте выпустить отсортированные страны:

- (void)dealloc
{
    ...
    [sortedCountries release];
    [super dealloc];
}
2 голосов
/ 31 января 2011

Создайте NSArray для вашего файла:

<code>
NSArray *iOSPlist = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"iOS" ofType:@"plist"]];
, затем в этом методе напишите после if (cell == nil) {

}:

<code>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
cell.textLabel.text = [[iOSPlist objectAtIndex:indexPath.row] objectForKey:@"name"];
}

и не забудьте вернуть [iOSPlist count] в табличном представлении - (NSInteger): (UITableView *) tableView numberOfRowsInSection: (NSInteger) метод раздела;

1 голос
/ 31 января 2011

Вот вопрос StackOverflow по работе с данными в списках.Ответы становятся довольно подробными.

Разбор списка (NSString) в NSDictionary

1 голос
/ 31 января 2011

Вот пример, извлекающий номер версии из списка info.plist. Используйте что-то подобное, чтобы вытащить ваш ключ имени (objectForKey: @ "name")

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"Info.plist"];
plist = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain]; 
NSString* version = [plist objectForKey:@"CFBundleVersion"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...