1

plistファイルからデータを読み取ろうとしています。これがその構造です

|term|detail(string)|

私のプロパティ:

@property (nonatomic, strong) NSDictionary *terms;
@property (nonatomic, strong) NSArray *termKeys;//this is just a array to keep track
@property (nonatomic, strong) NSString *detail;

これは、cellForRowAtIndexPathの詳細にアクセスする方法です。

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [[UITableViewCell alloc]
                             initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    NSString *currentTermsName = [termKeys objectAtIndex :[indexPath row]];
                                  [[cell textLabel] setText:currentTermsName];
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;


    detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];

    NSLog(@" bombs %@",terms[@"Bomb Threats"]);
    return cell;

}

そして、私が持っているdidloadを表示します

 - (void)viewDidLoad
    {
        [super viewDidLoad];


        NSString *myfile = [[NSBundle mainBundle]
                            pathForResource:@"terms" ofType:@"plist"];
        terms = [[NSDictionary alloc] initWithContentsOfFile:myfile];
        termKeys = [terms allKeys];
    }

値にアクセスしますが、オブジェクトごとに同じ値を格納します。たとえば、plistに5つの異なるレコードがある場合、詳細を印刷すると、同じレコードが5回表示されます。

Once detail is set then I pass it to detialView
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"detailsegue"]){
        TermsDetailViewController *controller = (TermsDetailViewController *)segue.destinationViewController;
        controller.detailTerm = detail;
    }
}

これが私の辞書です:http: //pastebin.com/bxAjJzHp

4

3 に答える 3

5

tableView をスクロールすると変化し続けるため、detail のプロパティを保持する必要はありません。コードは cellForRowAtIndexPath: に記述されています。

次のコードを実装してみてください。

- (void)viewDidLoad{ 

      //Path of plist from bundle
      NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"plistFil" ofType:@"plist"];

     //Since your plist's root is a dictionary else you should form NSArray from contents of plist
      self.terms = [NSDictionary dictionaryWithContentsOfFile:plistPath];

      self.termKeys = [self.terms allKeys];

      [self.tableView reloadData];

     //As you have a key for "Bomb Threats" in your plist,try logging if it successfully initialized with values of plist
      NSLog("%@",terms[@"Bomb Threats"]);
}



 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsForSection:(NSInteger)section{
       return [self.termkeys count];
}

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

     //Initialize cell

     NSString *key   = self.termKeys[indexPath.row];
     NSString *value = self.terms[key];

     cell.textLabel.text = key;
     cell.detailTextLabel.text = value;

     return cell;
}

編集:

//セグエがセルから直接来ている場合は、これを使用してみてください

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"detailsegue"])
    {
        TermsDetailViewController *controller = (TermsDetailViewController *)segue.destinationViewController;
        NSIndexPath *indexPath = [ self.tableView indexPathForCell:sender];
        NSString *key   = self.termKeys[indexPath.row];
        self.detail = self.terms[key];
        controller.detailTerm = self.detail;
    }
}
于 2013-03-04T05:06:18.037 に答える
0

これを試して

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

static NSString *CellIdentifier = @"Cell";

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

NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        strPath = [strPath stringByAppendingPathComponent:@"fileName.plist"];
NSMutableDictionary  *terms = [NSMutableDictionary dictionaryWithContentsOfFile:strPath];
NSArray *arrTemp =[terms allKeys];
arrTemp = [arrTemp sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSString *detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];
cell.textLabel.text = detail;

return cell;
}
于 2013-03-04T05:44:32.937 に答える
0

これが私のやり方です。

 NSString *plistFile = [[NSBundle mainBundle] pathForResource:@"myPlist" ofType:@"plist"];
 NSDictionary *terms = [NSDictionary dictionaryWithContentsOfFile:plistFile];
 NSLog(@"%@", [terms objectForKey:@"term1"]);

あなたのコードで、もし

termKeys = [terms allKeys];

次に、これは正しい値を返す必要があります。

detail = [terms objectForKey:[termKeys objectAtIndex:indexPath.row]];
于 2013-03-04T01:07:24.517 に答える