使用 indexpath.row 引用从 JSON 对象数组中获取对象

Posted

技术标签:

【中文标题】使用 indexpath.row 引用从 JSON 对象数组中获取对象【英文标题】:Using indexpath.row to refer to get an object from an array of JSON objects 【发布时间】:2013-12-04 10:12:41 【问题描述】:

尊敬的 *** 用户,

第一次发帖,我会尽力而为!

我有一个简单的 JSON 文件,看起来像这样(我不会包含所有文件,因为它太长了):


"guidelines": [

  "title": "Editorial - Doporučené postupy",
  "guidelinepath": "1 - Editorial"
,

  "title": "Preambule",
  "guidelinepath": "1 - Preambule"
,

  "title": "Zásady dispenzární péče ve fyziologickém těhotenství",
  "guidelinepath": "1- Z"
,

  "title": "Provádění screeningu poruch glukózové tolerance v graviditě",
  "guidelinepath": "2"
]

有了这些数据,我设法填充了一个 tableView(即,在命令行输出中正确解析的 JSON),为我欢呼。现在我想做的是检测已被点击的 tableView 单元格并指向与该标题相关的 guidelinepath JSON 对象(这将导致一个文本文件将填充一个文本视图)。我试过了许多不同的解决方案,但它们都导致了 (null)。

以下是我设法完成且没有错误的不完整代码。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

if ([segue.identifier isEqualToString:@"showGuideline"]) 
    NSLog(@"seguehasbeenselected");
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    NSLog(@"%@ is the indexpath", indexPath);


我已尝试彻底研究该问题,并尝试通过以下答案帮助自己: Using indexPath.row to get an object from an array

getting json object and then assign to uitable view

但他们无法以某种方式真正回答我的问题。任何帮助将不胜感激!

如果想了解更多关于 JSON 是如何解析的信息,下面是代码:


[super viewDidLoad];
NSString *jsonFilePath = [[NSBundle mainBundle] pathForResource:@"postupy" ofType:@"json"];
NSData *jsonData = [NSData dataWithContentsOfFile:jsonFilePath];
NSError *error = nil;
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
NSLog(@"%@",dataDictionary);
self.guidelines = [dataDictionary objectForKey:@"guidelines"];
self.guidelineFiles = [dataDictionary objectForKey:@"guidelinepath"];

指南文件和指南的声明:

#import <UIKit/UIKit.h>


@interface PostupyTableViewController : UITableViewController

@property (nonatomic, strong) NSArray *guidelines;
@property (nonatomic, strong) NSArray *guidelineFiles;


@end

-- 最终解决方案--

我按如下方式编辑了 prepareForSegue 方法,现在它可以完美运行:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if ([segue.identifier isEqualToString:@"showGuideline"]) 
        NSLog(@"seguehasbeenselected");
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSLog(@"%@ is the indexpath", indexPath);
        NSDictionary *item = [self.guidelines objectAtIndex:indexPath.row];
        NSString * path = [item objectForKey :@"guidelinepath"];
        NSLog(@"%@ is the path",path);
        PostupyDetailViewController *pdwc = (PostupyDetailViewController *)segue.destinationViewController;
        pdwc.guidelineChosen = path;
    

【问题讨论】:

+1 以获得漂亮的格式。欢迎来到 SO 非常感谢 :)!期待解决这一挑战:) 显示您的guidelineFiles声明。 @stefbmt 'didSelectRowAtIndexPath' 将在 'prepareForSegue' 之后被调用。这就是索引路径为空的原因。 【参考方案1】:

从您的 json 看来,[dataDictionary objectForKey:@"guidelines"];返回一个 NSArray。所以访问正确的项目只需使用:

NSDictionary *item = [self.guidelines objectAtIndex:indexPath.row];
NSString     *path = [item objectForKey:@"guidelinepath"];

【讨论】:

嗨垫,非常感谢您的帮助。我尝试 NSLog "path" ,但它似乎没有输出任何东西。即最后输出的日志是“..是索引路径” 不客气,请记住,Json 数组包含在 "[ ]" 和字典(键值元素)之间的 " " 之间。 添加了你的两行并将路径实例传输到 DetailViewController 但没有设法让它工作:NSDictionary *item = [self.guidelineFiles objectAtIndex:indexPath.row]; NSString * path = [item objectForKey :@"guidelinepath"]; NSLog(@"%@ is the path",path); PostupyDetailViewController *pdwc = (PostupyDetailViewController *)segue.destinationViewController; pdwc.guidelineChosen = path; 嗨@Mat!刚刚意识到编写了指南文件而不是指南,现在它就像一个魅力!谢谢谢谢谢谢!

以上是关于使用 indexpath.row 引用从 JSON 对象数组中获取对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?

如何从扩展的 collectionview 到达 tableview 的 indexpath.row?

从 TableView Objective C 中获取 IndexPath.Row [重复]

在 prepareForSegue 中访问 CollectionView indexPath.row

在 ViewDidLoad 中使用 objectAtIndex:indexPath.row [关闭]

indexPath.row 始终为 0