如何以编程方式将 JSON 数组从 UITableViewCell 传递到新的 UIViewController?

Posted

技术标签:

【中文标题】如何以编程方式将 JSON 数组从 UITableViewCell 传递到新的 UIViewController?【英文标题】:How do you pass a JSON Array from a UITableViewCell into a new UIViewController programmatically? 【发布时间】:2014-03-14 11:24:05 【问题描述】:

这是我目前所知道的:

FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>

@end

FirstViewController.m

#import "FirstViewController.h"
#import "CellDetailView.h"

@interface FirstViewController()
@property (strong, nonatomic) NSMutableArray *myMutableArray;
@end

- (void)viewDidLoad
  //...


//There's a JSON method here that's working just fine populating the UITableViewCells as intended.
//        ...JSON URL STUFF...
//        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
//        NSError *errorJson = nil;
//        NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&errorJson];
        self.coolDict = [dataDictionary objectForKey:@"coolStuff"];
        self.myMutableArray = [self.coolDict objectForKey:@"stuff_1"];
        [self.tableView reloadData];



//UITableViewCell method here, works great!



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    CellDetailView *nextViewController = [[CellDetailView alloc] init]; //This is a UIViewController Class I made.
    NSDictionary *someInfo = self.myMutableArray[indexPath.row];  // This is logging the array for each cell, that's cool.
    NSLog(@"%@", someInfo);
    [[self navigationController] pushViewController:nextViewController animated:YES];

CellDetailView.h

#import <UIKit/UIKit.h>
#import "FirstViewController.h"

@interface CampaignItemDetails : UIViewController

@end

CellDetailView.m

#import "CellDetailView.h"
#import "FirstViewController.h"

@interface CellDetailView ()
@end

@implementation CellDetailView


- (void)viewDidLoad

[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UILabel *myDetailLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
myDetailLabel.text = someInfo[@"title"];
[self.view addSubview:myDetailLabel];  //THIS DOESNT WORK :(


@end

如何将 myMutableArray 放入 CellDetailView 中,以便使用数组中的更多 JSON 数据填充 ViewController?

*我知道这个想法是推送到 CellDetailView(并且不是从 FirstViewController 中拉出)。*

我已经看到了有关如何将数据从视图控制器传递到视图控制器的答案,但它非常抽象,而且我对目标 C 还很陌生。我还发现了很多关于 Storyboards 和 Nibs 的东西,但我我没有使用这些东西。

【问题讨论】:

【参考方案1】:

我很想像这样覆盖 initMethod:

 NSDictionary *someInfo = self.myMutableArray[indexPath.row]; 
 CellDetailView *nextViewController = [[CellDetailView alloc] initWithInfo:someInfo];
 [[self navigationController] pushViewController:nextViewController animated:YES];

确保在您的 cellDetailView 中添加 init Mehtod:

- (id) initWithInfo:(NSDictionary *) info 

    self = [super init];

    if (self) 

       //Now you can save the info to a private NSDictionary property:

    

    return self;

确保添加:

- (id) initWithInfo:(NSDictionary *) info;

在您的 cellDetailView .h 中。

【讨论】:

老兄。是的。这是无法控制的,您回答的速度有多快,而且效果很好。附带问题,我在 CellDetailView.m 的 viewdidload 中有一个导航控制器,但它现在消失了。 initWithInfo 会变成一些超级视图还是什么?对不起,如果这太含糊了,如果你需要我可以澄清一下。 消失是什么意思?导航栏不存在? 在我添加 init 方法之前它就存在,现在它没有出现。 您是否删除了旧的初始化方法?它应该从您的 FirstViewController 接收导航控制器。这有导航栏吗? 我的错...我正在向 init 方法添加子视图,这些子视图覆盖了其他所有内容。我太傻了。现在一切都解决了,你帮了我很大的忙!谢谢。【参考方案2】:

在您的 didSelectRowAtIndexPath 中使用此代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    CellDetailView *nextViewController = [[CellDetailView alloc] init]; //This is a UIViewController Class I made.
    NSDictionary *someInfo = self.myMutableArray[indexPath.row];  // This is logging the array for each cell, that's cool.
    NSLog(@"%@", someInfo);

    nextViewController.info = someInfo; //You should define info property in your next controller
    [[self navigationController] pushViewController:nextViewController animated:YES];

您应该在下一个控制器中定义 info 属性

@interface CellDetailView : UIViewCintroller
@property (nonatomic, strong) NSDictionary *info;
@end

【讨论】:

【参考方案3】:

您可以在 Cell 类中创建 DelegateMethod。

在您的 TableViewCell.h 文件中

@protocol CellDelegate <NSObject>
-(void)passJSONArray:(JSONArray *)jsonArray;
@end

@property(nonatomic, assign)id<ButtonCellDelegate> delegate;

在您的 TableViewCell.m 文件中

创建发送 JsonArray 的方法。

关于 JSONArray Getter 方法或在您获取数组的方法中

你可以调用 sendJSONArray() 喜欢

 -(NSArray *)gotMYJSONArray;
 
    //getJsonArray
    [self sendJSONArray:jsonArray];
    return jsonArray;
 

-(void)sendJSONArray(JSONArray *)jsonArray

   if([_delegate respondsToSelector:@selector(passJSONArray:)])
    
        [_delegate passJSONArray:jsonArray];
    

在你的视图控制器上

-(void)passJSONArray:(JSONArray *)array

    self.jsonArray = array;

【讨论】:

以上是关于如何以编程方式将 JSON 数组从 UITableViewCell 传递到新的 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iPhone 的 JSON 框架以编程方式生成 JSON

如何以编程方式在 UITableView 中添加视图?

以编程方式将视图添加到表视图中的单元格

如何以编程方式向下滚动表格

从数组向 UITable 添加行

如何以编程方式控制行的切换?