将JSON对象从一个表视图传递到另一个表视图

时间:2014-02-07 13:38:28

标签: objective-c json ios7

这是我的JSON数据的结构

[
{
$id: "1",
Speeches: [],
Id: 1,
Year: "1999"
},
{
$id: "18",
Speeches: [],
Id: 2,
Year: "2000"
},
{
$id: "49",
Speeches: [],
Id: 3,
Year: "2001"
},

语音对象的结构如下

Speeches: [
{
$id: "2",
Year: {
$ref: "1"
},
Id: 4,
YearId: 1,
Title: "الكلمة السامية بمناسبة زيارة قيادة الحرس الوطني تاريخ 30 مارس 1999",
HeaderOne: "بسم الله الرحمن الرحيم",
HeaderTwo: null,
Body: "أيها الأخوة والزملاء . . يسرني في هذا اليوم أن ألتقي بكم ، ولقد أردت بهذه الزيارة أن أرد لكم التحية على ما قمتم به .. وأظهرتموه في هذا الظرف الدقيق من تحاب وتكاتف كأسرة واحدة متراصة تسهر على سلامة الوطن وسلامة أهله والمقيميـن فيه في ظل دولة المؤسسات والقانون ..    وأن أشكر لكم مشاعركم تجاهنا في فقد والد الجميع أميرنا وقائدنا الراحل المغفور له سيدي صاحب السمو الشيخ عيسى بـن سلمان آل خليفة طيّب الله ثراه . . الذي كان بالفعل والد الجميع . . والذي جمعنا على الوئام والمحبة ، وعلى البذل والعطاء لهذا الوطن بلا حدود . . وفي ظل هذه المسيرة ، وتحت هذه الراية ومن هذا الموقع يطيب لي أن أوجه باسمكم جميعاً ، التقدير والتحية إلى الوالد العم العزيز صاحب
ImageName: "img787.png"
},
{
$id: "3",
Year: {
$ref: "1"
},
Id: 5,
YearId: 1,
Title: "الكلمة السامية الأولى بعد تولي مقاليد الحكم في البلاد تاريخ 13 مارس 1999م",
HeaderOne: "بسم الله الرحمن الرحيم",
HeaderTwo: null,
Body: "شعبنـا العزيـز …  السلام عليكم ورحمة الله وبركاته ،  قال تعالى : " من المؤمنين رجالٌ صدقوا ما عاهدوا الله عليه ، فمنهم من قضى نحبه ، ومنهم من ينتظر ، وما بدلوا تبديلا " صدق الله العظيم .   أما بعد :-  ففي هذا الموقف التاريخي يجمعنا واياكم المصاب الجلل في فقيدنا العظيم ووالدنا القائد ،    وتوحّدنا واياكم ، في الوقت ذاته ، مسؤولية التطلع بثـقة للمستقبل لمواصلة المسيرة على النهج الذي رسمه لنا من واسع حكمته وإخلاصه وسماحته ، هذا مع الاستعداد لمواجهة 
ImageName: "img002.png"
},

我需要在一个表视图中显示年份,然后在第二个表视图中显示相应年份中的演讲标题。我已经建模了两个数据对象Year和Speech,如下所示:

@interface Year : NSObject

@property (nonatomic, strong) NSString *yearName;
@property (nonatomic, strong) NSArray *speeches;

@end

@interface Speech : NSObject

@property (nonatomic, strong) NSString *title;
@property(nonatomic,strong) NSString *header;
@property(nonatomic,strong) NSString *body;
@property(nonatomic,strong) NSString *image;

@end

检索数据并显示工作正常。这就是我的做法。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *dataApi = [NSURL URLWithString:@"http://vbahrain.azurewebsites.net/api/yearapi"];

    NSData *jsonData =[NSData dataWithContentsOfURL:dataApi];

//    NSLog(@"%@", jsonData);

    NSError *error = nil;



    self.years = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

    self.yearBucket = [NSMutableArray array];


    for (NSDictionary * dict in self.years) {

        Year *year = [[Year alloc ]init];

        year.yearName =[dict objectForKey:@"Year"];
        year.speeches = [dict objectForKey:@"Speeches"];

        [self.yearBucket addObject:year];
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    Year *year = [self.yearBucket objectAtIndex:indexPath.row];


    cell.textLabel.text = year.yearName;


    cell.detailTextLabel.text = [NSString stringWithFormat:@"%lu", [year.speeches count]];

    return cell;
}

现在我正在尝试使用prepare for segue方法将数据传递到下一个View控制器,如下所述

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].

    TitleViewController *tvc = [segue destinationViewController];

    // Pass the selected object to the new view controller.

    NSIndexPath *path = [self.tableView indexPathForSelectedRow];

    Year *selectedYear = self.yearBucket[path.row];


    for (NSDictionary *dict in selectedYear.speeches){


        Speech *speech = [[Speech alloc ]init];

        speech.title =[dict objectForKey:@"Title"];
        speech.header = [dict objectForKey:@"HeaderOne"];
        speech.body = [dict objectForKey:@"Body"];

      [tvc.speechesForSelectedYear addObject:speech];
}

现在这是我用来显示speechesForSelectedYear Mutable数组中传递的数据的方法。这是第一个其他表视图的标题

@interface TitleViewController : UITableViewController

@property (nonatomic, strong) NSMutableArray *speechesForSelectedYear;

@end


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    Speech *speech = [self.speechesForSelectedYear objectAtIndex:indexPath.row];

    cell.textLabel.text = speech.title;


    return cell;
}

但是第二个表视图没有显示任何内容。我哪里错了?

1 个答案:

答案 0 :(得分:1)

尝试添加第二个表的类:

@synthesize speechesForSelectedYear=_speechesForSelectedYear;

-(NSMutableArray*)speechesForSelectedYear
{
    if (!_speechesForSelectedYear)
        _speechesForSelectedYear = [[ NSMutableArray alloc] init];
    return _speechesForSelectedYear;
}

问题可能是当你调用[tvc.speechesForSelectedYear addObject:speech]时没有分配speechesForSelectedYear数组。使用此函数,您可以覆盖属性的getter,这样您就可以确定无论您在何处使用该数组,都可以使用该数组。

在Objective-c中,如果数组是 nil ,你将不会收到错误或异常但不会发生任何事情。