0

我的“MasterView”() 类中有一个方法,它从 URL 解析 .json 数据,然后用该信息填充表格视图。为了更有条理并将该方法与其他需要的方法组合在一起,我尝试将其移至另一个 NSOject 类,但它不起作用;没有错误,没有例外,表格视图根本不会填充。

这是“大师班”中的原始方法

- (void) fetchPosts:  
{
    NSError *error;

    NSData *responseData = [NSData dataWithContentsOfURL:myURL];

    NSDictionary *json = [NSJSONSerialization
                      JSONObjectWithData:responseData

                      options:kNilOptions
                      error:&error];

    NSArray *objects = [[json objectForKey:@"data"] objectForKey:@"children"];

    arr = [[NSMutableArray alloc] init];

    for (NSDictionary *object in objects) {
        NSString *title = [[object objectForKey:@"data"] objectForKey:@"title"];

        //Post is just a random NSObject Class
        Post *post = [[Post alloc] init];
        post.title = title;
        [arr addObject:post];
    }

    NSLog(@"Called");
    [self.tableView reloadData];
}

另一个类中的编辑方法:

- (void) fetchPosts:(NSURL *)myURL withPostArray:(NSMutableArray*)postArr andTableView: (UITableView*)tableView
{
   NSLog(@"CAlled");

    NSError *error;

    NSData *responseData = [NSData dataWithContentsOfURL:myURL];

    NSDictionary *json = [NSJSONSerialization
                      JSONObjectWithData:responseData

                      options:kNilOptions
                      error:&error];

    NSArray *objects = [[json objectForKey:@"data"] objectForKey:@"children"];

    postArr = [[NSMutableArray alloc] init];

    for (NSDictionary *object in objects) {
        NSString *title = [[object objectForKey:@"data"] objectForKey:@"title"];

        Post *post = [[Post alloc] init];
        post.title = title;
        [postArr addObject:post];
    }


    [tableView reloadData];
}

有效的原始方法称为:[self fetchPosts:];另一个是:[MyClass fetchPosts:myUrl withPostArray:arr andTableView:self.tableView];

我编辑了一些信息以使其更具可读性,所以如果有任何错误,请告诉我。

MyClass.h:

@interface MyClass : NSObject <UITableViewDelegate, UITableViewDataSource>

在 MasterView 中设置数据源:

//In ViewDidLoad
_delegate = myClass;

self.tableView.dataSource = _delegate;
self.tableView.delegate = _delegate;

//In .h 

@property (strong, nonatomic) MyClass *delegate;

当我调用时,我从编译器中什么也得不到[MyClass fetchPosts:myUrl withPostArray:arr andTableView:self.tableView];

4

1 回答 1

1

如果表视图未填充,则表视图未通过数据源获取所需数据。

有可能您没有将您的 设置dataSource为您创建tableView的新的NSObject,或者那MasterView仍然dataSourcetableView.

此外,请确保实际调用了此方法,并且传递tableView的是视图中显示的方法。


编辑:您有三个解决方案:

  1. 将数据源分配给您创建的新对象,以便它处理使用数据更新表视图,因为它现在具有实际数据。
  2. 调整该方法以将解析后的数据返回给MasterView它并调用[self.tableView reloadData]. 但从 MVC 的角度来看,这并不是很好。
  3. 第三个选项要求您创建一个UIVieController来处理您的MasterView,它应该是dataSource用于表格视图的。视图控制器应该从新对象调用上述方法,以检索数据并更新表视图。即像第二种解决方案一样,但视图控制器将调用该方法而不是MasterView.
于 2013-06-03T23:01:31.610 回答