Obj-C在加载时加载自定义.plist文件 - iPhone

时间:2011-03-02 23:34:09

标签: iphone objective-c xml uitableview

我希望加载一个特定的.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. 使用2个变量设置NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@", area] ofType:@"plist"]; 的正确方法是什么(设置变量区域和上一个视图中按下的按钮的值(我有一个NSString用于该值))?
  2. 每次显示视图时如何更新*路径?
  3. 如果这是一个解决方案,每当按下“后退”按钮时,如何卸载视图(这样可以解决问题,因为每次用户移动到此视图时都会调用viewDidLoad,对吧?)
  4. 以下是我的其余代码:

        - (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)。

    当除了Region1之外的任何东西(我到目前为止只生成了Region1.plist)或者iPhone Simulator / 4.2 /.../.../ Region1时,

    NSLog(@"Path is %@",path);显示(null)。 plist中

1 个答案:

答案 0 :(得分:0)

我不太明白在viewWillAppear:中使用代码的问题。在您的视图从XIB取消归档后或在viewDidLoad之后取决于您的方法时,会调用-loadView

如果每次查看时都需要更新,那么viewWillAppear:就是放置此代码的正确位置。如果这不起作用,可能是因为NSUserDefaults没有时间在设置视图中更新和推回到该视图之间进行同步。通常,同步大约每30秒发生一次,但可以强制[NSUserDefaults synchronize]