-2

我正在使用带有 ARC 的 Xcode 4.5 创建一个 UITableViewController 类,我想用一个 NSDictionary 对其进行初始化。在其初始化程序中,创建的 [resourcesAsDictionary 计数] 返回了一些正确的值,但稍后当我在主视图中按下按钮时,表格是根据 NSDictionary 的条目数构建的,我用 NSDictionary 初始化了类始终为空并且 [resourcesAsDictionary count] 返回 0。我认为这与 ARC 有关吗?如果我将其关闭,我可以保留该变量吗?但是必须有一种方法可以使用 ARC 来获得这个?)相关代码:

编辑:我已经根据收到的帮助更改了代码。
编辑2:因为我能够缩小问题的范围,这有点令人困惑,而且阅读量很大,我创建了一个新主题:ViewController 类在创建视图时创建新实例,但它应该使用现有的一个
编辑 3:问题在已经链接的线程中解决了,这个也是。

视图控制器.h:

#import <UIKit/UIKit.h>
#import <Foundation/NSJSONSerialization.h>
#import <Foundation/NSXMLParser.h>
#import "ResourcesTableViewController.h"

@interface ViewController : UIViewController <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource> {
// Note: this <UITableViewDelegate, UITableViewDataSource> is NOT related to the TableViewController. My ViewController has another TableView.
NSDictionary *parsedResponseAsDictionary;
ResourcesTableViewController *resourceTableViewController;
...
}
...

ViewController.m 中的某处:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    parsedResponseAsDictionary = [[NSDictionary alloc] init];
}
...
-   (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_bodyData {
    parsedResponseAsDictionary = [NSJSONSerialization JSONObjectWithData:bodyData options:NSJSONWritingPrettyPrinted error:&err];
    ... // putting found keys as entries in an array foundResources
    if ([foundResources count] > 0) {
        resourceTableViewController = [[ResourcesTableViewController alloc] initWithStyle:UITableViewStylePlain];
        [resourceTableViewController setResourcesAsDictionary:parsedResponseAsDictionary];
        NSLog(@"Delivered %i entries.",[[resourceTableViewController resourcesAsDictionary] count]);
        // TableView can be built: enable "Show Resources" button
        [_showResourcesButton setAlpha:1];
        [_showResourcesButton setEnabled:YES];
    }
}
...
// Output:
// REST Analyzer[1259:c07] Delivered 8 entries.
// REST Analyzer[1259:c07] viewWillAppear: (null)
// REST Analyzer[1259:c07] Now: 0 entries.

资源表视图控制器.h:

#import <UIKit/UIKit.h>

@interface ResourcesTableViewController : UITableViewController {
}

@property (nonatomic, strong) NSDictionary *resourcesAsDictionary;

@end

资源表视图控制器.m:

#import "ResourcesTableViewController.h"

@implementation ResourcesTableViewController

// - (id)initWithDictionary:(NSDictionary*)dic {
//    if (self = [super init])
//        resourcesAsDictionary = [[NSDictionary alloc] initWithDictionary:dic];
//    NSLog(@"resource table created with %i entries.",[resourcesAsDictionary count]);
//    return self;
// }

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"viewWillAppear: %@", self.resourcesAsDictionary);
    // (null) is returned here.
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"Now: %i entries.",[self.resourcesAsDictionary count]);
    return [self.resourcesAsDictionary count];
}

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

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2
                                      reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = @"Cell";
    cell.detailTextLabel.text = @"Description";

    return cell;
}
4

1 回答 1

1

我会以几种方式改变它......

删除 resourcesAsDictionary 的 iVar 并将其设置为属性。

@property (nonatomic, strong) NSDictionary *resourcesAsDictionary;

然后,我将通过删除您的 init 方法并改用此属性来更改初始化。

在推送到此控制器的 viewController 中(即您调用 initWithDictionary 的位置)...

而不是 initWithDictionary 有...

ResourcesTableViewController *tvc = [[ResourcesTableViewController alloc] initWithStyle:<whicheverstyleyouneed>];

然后设置属性...

tvc.resourcesAsDictionary = mySourceDictionary;

然后推TVC...

[self.navigationController pushViewController:tic animated:YES];

...或者但是您将其推送到屏幕上。

最后,您需要将 numberOfRows... 代码更改为...

return [self.resourcesAsDictionary count];

这将是我的方法,这意味着您不必重写 UITableViewController 类的初始化。

通过拥有强大的属性,您可以确保它在拥有对象的生命周期内一直存在。通过不覆盖 init,您可以确保您不会错过任何在 initWithStyle 中调用的代码...

如果这不起作用,那么我只能认为您首先创建字典的方式有问题。

在 - (void)viewWillAppear... 函数中告诉我...的输出

NSLog(@"%@", self.resourcesAsDictionary);
于 2012-10-01T14:41:38.990 回答