ios/objective-c:在 table 加载之前获取数组的计数

ios/objective-c: Get count of array before table loads

我正在用一个数组的内容填充一个表视图。现在,我在 viewdidload 中创建数组,并在委托方法

中计算行数
//in viewdidload

dispatch_async(kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL: kItemsURL];
        [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
    });

    [self.tableView reloadData];

//method called in viewdidload to create array...
- (void)fetchedData:(NSData *)responseData {
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                         options:kNilOptions
                                                           error:&error];
    NSLog(@" %@",json);
    NSArray* latestItems = [json objectForKey:@"items"];
    NSLog(@" array:%@",latestItems);
//getItems is a property in .h file
    self.getItems = latestItems;
    NSLog(@"getItems %@",_getItems); //logs out array ok
    int size = [_getItems count];
    NSLog(@"there are %d objects in the array", size);//provides correct number
}


    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 NSLog(@"getItems %@",_getItems); //logs (null)
    int size = [_getItems count];
    NSLog(@" %d objects in the array", size);//logs 0

当我在创建数组后计算 viewdidload 中的行数时,我得到了正确的数字,但是,当我在委托方法中对数组调用 count 时,它 returns 可能是因为tableview 在调用 Viewdidload 之前创建。

我应该在哪里创建数组,以便在 numberofrows 计算数组中的行数时知道它?

编辑:

构建数组后,我将其保存到属性。但是,当我在 numberofrowsinsection 方法中将它记录到控制台时,我发现这个 属性 是空的,所以问题似乎在于我如何存储这个数组。

现在,我在 .h 文件中有一个 属性,我也在实现中尝试过它,但无论哪种方式,由于某种原因它都没有持续存在。

我不太熟悉 obj-C,但我知道您需要在 viewDidLoad() 函数之外初始化数组。您的 .count 返回零的原因是因为您的数组充当 viewDidLoad() 函数的局部变量。相反,您可以将数组初始化为 UITableViewController class 中的字段。这就是你在 swift 中的做法,但它也适用于 obj-C:

class YourTableViewController: UITableViewController {

    var yourArray = [AnyObject]()

    override func viewDidLoad() {

        //You can still do any programming to set up values and elements in yourArray[] here 
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return yourArray.count
    }

    //Plus all your other tableView functions...
}

此外,如果您要在其他 UIViewController 之间将信息传递给您的数组,您可以将此功能添加到您的 class,这样每次您返回到您的 table 视图它加载正确的 table 细胞计数:

override func viewWillAppear(animated: Bool) {
    self.tableView.reloadData()
}

考虑将数据的创建(在 table 视图中实例化的数组)抽象为模型。这通常被认为是更好的软件工程实践(阅读:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html)。

我要做的是将另一个文件作为 Class 或结构,并在其中填充 table 视图中使用的数组的数据。我还建议在数组 class/struct 中也使用 setter/getter 方法。当加载 table 视图时,我们将在您的 table 视图 viewDidLoad() 方法中从 class/struct 中获取数据。数组中的数据也可以在应用程序的任何其他位置使用,因为它不再依赖于 table 视图。

旁注:如果模型应该只实例化一次,您也可以考虑将 class/struct 设为单例。

我建议在 viewDidLoad() 中加载数组的内容,在 table 视图使用数组之前调用一次。 table 视图不会在 viewDidLoad 之前加载项目。您正在做与下面这个示例结构大不相同的事情吗?

@implementation ViewController {
    NSArray *arrayList;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    arrayList = @[@"item 1", @"item 2"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.text = [arrayList objectAtIndex:indexPath.row];
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return arrayList.count;
}

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