Obj-C Загрузить пользовательский файл .plist при загрузке - iPhone - PullRequest
1 голос
/ 03 марта 2011

Я ищу, чтобы загрузить определенный файл .plist в зависимости от переменной настроек (в данном случае area) и от того, какую кнопку нажимал пользователь.Формат файла для .plist будет area-buttonPressed.plist.Ниже приведен код, который используется для вызова определенного файла .plist (в настоящее время зависит только от текущей области)

- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad");
self.navigationItem.title = @"Species List";

}

-(void)viewWillAppear:(BOOL)animated{
    NSLog(@"viewWillAppear");
    area  = [[NSUserDefaults standardUserDefaults] stringForKey:@"mulValue"];
    NSLog(@"Area is %@",area);
    NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@", area] ofType:@"plist"];
    NSLog(@"Path is %@",path);
    NSMutableDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
    self.names = dict;
    [dict release];
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
    self.keys = array;
}   

Моя главная проблема заключается в том, что если я поместлю код, который в данный момент находится в viewWillAppear, в viewDidLoad, он не будет вызываться снова, если я вернусь назад (я использую NavigationController), изменим область в настройках и снова перейду к этому viewController.В результате этот метод отлично работает при первой загрузке этого представления, но так будет до тех пор, пока я не соберу свой файл снова.

Мои основные вопросы:

  1. Как правильно установить NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@", area] ofType:@"plist"]; , используя 2 переменные (область переменных настроек и значение кнопки, нажатой в последнем виде (у меня естьNSString для этого значения))?
  2. Как мне обновлять * путь каждый раз, когда отображается представление?
  3. Если это будет решением, как выгрузить представление всякий раз, когда 'Нажата кнопка «Назад» (это решит проблему, потому что viewDidLoad вызывается каждый раз, когда пользователь переходит к этому представлению, верно?)

Ниже приведен остаток моего кода:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [keys count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    NSString *key = [keys objectAtIndex:section];
    return key;
    }

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *key = [keys objectAtIndex:section];
    NSArray *nameSection = [names objectForKey:key];
    return [nameSection count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];

    NSString *key = [keys objectAtIndex:section];
    NSArray *nameSection = [names objectForKey:key];

    static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SectionsTableIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SectionsTableIdentifier] autorelease];
    }

    cell.textLabel.text = [nameSection objectAtIndex:row];
    return cell;
    }

- (void)viewDidUnload{
    self.names = nil;
    self.keys = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [names release];
    [keys release];
    [super dealloc];
}

Заранее спасибо!

РЕДАКТИРОВАТЬ: Некоторая информация о том, что говорит мой NSLog:

Всякий раз, когда я нажимаю кнопку, чтобы загрузить представление таблицы, моя консоль показывает «viewWillAppear» и NSLog(@"Area is %@",area); показывает правильную область (Region1 в данном случае).

NSLog(@"Path is %@",path); либо показывает (null), когда выбрано что-либо, кроме Region1 (пока я создал только Region1.plist), либо iPhone Simulator / 4.2 /.../.../ Region1.plist

1 Ответ

0 голосов
/ 03 марта 2011

Я не совсем понимаю проблему с кодом в viewWillAppear:.viewDidLoad вызывается после того, как ваше представление было разархивировано из XIB или после -loadView в зависимости от вашего подхода.

Если его необходимо обновлять каждый раз, когда представление отображается, то viewWillAppear: является правильнымместо, чтобы положить этот код.Если это не сработает, возможно, это связано с тем, что NSUserDefaults не успел синхронизироваться между обновлением в представлении настроек и возвратом к этому представлению.Обычно синхронизация происходит примерно каждые 30 секунд, но может быть принудительно установлена ​​с помощью [NSUserDefaults synchronize].

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