【问题标题】:How to access NSMutableArray from my FirstViewController如何从我的 FirstViewController 访问 NSMutableArray
【发布时间】:2013-01-17 12:35:39
【问题描述】:

我能够解析 JSON 并将其存储在我的 FirstViewController 中名为 json 的 NSMutableArray 中。问题是,我不知道如何从我的视图控制器访问我的FirstViewController 中的数组。

编辑!!!

我将代码从 AppDelegate 移到了我的 FirstViewController,因为这不是一个好习惯。

FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController
{
    NSMutableArray *jsonData;
}

@property (nonatomic, strong) NSMutableArray *jsonData;

@end

FirstViewController.m

@synthesize jsonData;

NSURL *url = [NSURL URLWithString:@"http://search.twitter.com/search.json?q=coredata"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
self.json = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];

SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.secondJSON = [self jsonData];
[[self navigationController] pushViewController:secondViewController animated:YES];

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController
{
    NSMutableArray *secondJSON;
}

@property (nonatomic, strong) NSMutableArray *secondJSON;

@end

SecondViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"%@", [self secondJSON]);
}

输出

2013-02-03 00:16:17.749 Subscription[24669:c07] (null)

我错过了什么吗?

【问题讨论】:

  • 你想将数组从一个viewccontroller传递到另一个??
  • 是的,但它不起作用。

标签: iphone ios objective-c ipad uiviewcontroller


【解决方案1】:

也许是[[[UIApplication sharedApplication] delegate] json]

(请在应用程序启动时不要在主线程上发送同步请求!

【讨论】:

  • @Jahm 因为它阻塞了主线程 -> 冻结了 UI。 永远不要在主线程上做网络。另外,您可以通过接受我的回答来表达您的感激之情。
  • 很高兴提出这个问题!我把它移到了我的第一个视图控制器!
  • @Jahm 我不认为这已经很好了。视图控制器同样是 UI 的一部分。您应该发送异步请求,然后手动将网络代码移动到单独的线程。
  • @Jahm Anywhere,只需将其包装到NSThread 或由dyspatch_async() 执行的块中,或者更好的是,使用+ [NSURLConnection sendAsynchronousRequest:]
  • 那么我可以将 sendAsynchronousRequest: 放到我的视图控制器中吗?
【解决方案2】:

首先,如果您使用的是 ARC,请更改

@property (nonatomic, retain) NSMutableArray *json;

@property (nonatomic, strong) NSMutableArray *json;

因为保留使您对弱的引用变得卑鄙。

在您的视图控制器中使用第二次访问

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
//appDelegate.json //Your Array

你为什么不直接在你的viewController中实现这个方法,AppDelegate类应该尽可能干净。

【讨论】:

  • 是的,我将它转移到了我的第一个视图控制器。问题是一样的,我无法从第二个和第三个视图控制器访问数组。顺便说一句,我正在使用标签栏。
【解决方案3】:

您可以在您的期望视图中创建应用程序委托的实例并调用其对象。

AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] 委托]; NSMutableArray *arMyArray = [NSMutableArray arrayWithArray:[appDelegate.json mutableCopy]];

【讨论】:

    【解决方案4】:

    试试这个,

         AppDelegate *appobj =  [[UIApplication sharedApplication] delegate];
         NSLog(@"%@",appobj.json);
    

    【讨论】:

      【解决方案5】:

      在您想要访问 json 数组的视图控制器中,像这样创建 appdelegate 的实例:

      AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
      

      然后使用此实例变量访问 json 数组。

       NSMutableArray *arMyArray = [[NSMutableArray alloc]initWithAaray:appdelegate.json];
      

      【讨论】:

        【解决方案6】:

        在您的SecondViewController 中创建NSMutableArray *listOfData 之类的

        #import <UIKit/UIKit.h>
            
            @interface SecondViewController : UIViewController
            
            @property (nonatomic, strong) NSMutableArray *listOfData;
            
            @end
        

        并在导航时将您的 NSMutableArray *jsonData; 传递给 SecondViewController
        (在创建 SecondViewController 的对象时) 比如,

        这段代码写在 FirstViewController

         SecondViewController *lvController = [[SecondViewController alloc] init];
         lvController.listOfData = self.jsonData;
         [self.navigationController pushViewController:lvController animated:YES];
        

        并在SecondViewControllerviewDidLoad 方法中检查,比如

        - (void)viewDidLoad
        {
            [super viewDidLoad];
        
            NSLog(@"My Data : %@", self.listOfData);
        }
        

        【讨论】:

        • 我会把这个放在哪里,SecondViewController *lvController = [[SecondViewController alloc] init]; lvController.listOfData = self.jsonData; [self.navigationController pushViewController:lvController animated:YES];
        • 我遵循了您的代码,但是当我继续访问我的 SecondViewController 时,它是 null
        • 在 SecondViewController 上你想去的地方
        • 这是一个标签栏项目,当我点击第二个标签时,它会进入SecondViewController及其null。
        • 那么......为什么你不从 SecondViewController 发送请求......解决它更容易......谢谢:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多