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

ios/objective-c:在加载表之前获取数组计数,ios,objective-c,count,Ios,Objective C,Count,我正在用数组的内容填充tableview。现在,我在viewdidload中创建数组,并计算委托方法中的行数 //in viewdidload dispatch_async(kBgQueue, ^{ NSData* data = [NSData dataWithContentsOfURL: kItemsURL]; [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data w

我正在用数组的内容填充tableview。现在,我在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
时,它可能返回零,因为tableview是在调用viewdidload之前创建的

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

编辑:

构造数组后,我将其保存到属性中。但是,当我用numberofrowsinsection方法将该属性记录到控制台时,我发现该属性为空,因此问题似乎在于如何存储该数组


现在,我在.h文件中有一个属性,我也在实现中尝试过它,但由于某种原因,它不会持久化。

我不太熟悉obj-C,但我知道您需要在
viewDidLoad()函数之外初始化数组。
.count
返回零的原因是数组充当了
viewDidLoad()
函数的局部变量。相反,您可以在
UITableViewController
类中将数组初始化为字段。这是您在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
之间向数组传递信息,可以将此函数添加到类中,因此每次返回表视图时,它都会加载正确的表单元格计数:

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

考虑将数据的创建(在tableview中实例化的数组)抽象为一个模型。这通常被认为是一种更好的软件工程实践(阅读:)

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


旁注:如果模型只被实例化一次,则可以考虑将类/结构单独化为一个。p> 我建议在viewDidLoad()中加载数组的内容,在表视图使用数组之前调用该内容一次。表视图在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;
}

填充数组后,[yourTableView重新加载数据];`我确实在我尝试过这个方法后立即调用self.reload tableView,但遇到了如何调用这个方法的问题。Ray Wenderlich写了一本很好的iOS单例指南。您可以在这里参考它:简而言之,在实例化您的类并分派它一次之后,您可以通过调用let arrayWithDataINeed=ArrayClass.SharedInstance在viewcontroller中调用您的类。数组来自json提要,但在其他方面没有什么不同。问题是我使用的是自定义表格单元格吗?感谢您在类名后立即显示数组的位置。哦,这就是问题所在。如果您从internet接收JSON,则需要在请求完成块上调用[tableView reloadData],因为请求需要一段时间来完成和接收数据。您是如何执行此请求的?我将属性从.h文件移到了.m文件,在上面和下面Alan所示的类名之后(尽管我不知道Swift)。其次,我将重新加载数据从viewdidload移到了实际的获取函数fetchedData。尽管有几个人帮了我,但我还是把这件事记对了。