当数组为空时,如何阻止我的UITableView崩溃?

时间:2015-05-14 01:48:59

标签: ios objective-c arrays uitableview

当我的应用用户注册一个帐户时,tableView会以空白开头(因为用户没有添加任何数据)。当即将填充的数组为空时,如何阻止应用程序崩溃?到目前为止,我已经尝试在表/数组为空时显示视图,但崩溃仍然发生......

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return [self.storageData count];

}

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *DoctorsTableIdentifier = @"StorageItemTableViewCell";

        StorageItemTableViewCell *cell = (StorageItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:DoctorsTableIdentifier];
        if (cell == nil)

            {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StorageItemTableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
            }

        if (self.storageData > 0) {

            noitemsView.hidden = YES;

                NSDictionary *tmp = [self.storageData objectForKey:[NSString stringWithFormat:@"%d",(long)indexPath.row]];


            [[cell itemName] setText:(NSString *)[tmp objectForKey:@"title"]];

                  NSString *title = [tmp objectForKey:@"title"];
                  [[cell itemName] setText:title];


                NSDictionary *node = [self.descripData objectAtIndex:indexPath.row];
                [[cell itemDescrip] setText:[node objectForKey:@"body"]];
                NSLog(@"%@", self.descripData);

                NSString *secondLink = [[self.descripData objectAtIndex:indexPath.row] objectForKey:@"photo"];

                [cell.itemPhoto sd_setImageWithURL:[NSURL URLWithString:secondLink]];

                NSLog(@"%@",secondLink);


                  }   
        else {
            noitemsView.hidden = NO;
        } 
                  return cell;
                  }

7 个答案:

答案 0 :(得分:1)

您需要更新numberOfRows Delegate方法

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   if ([self.storageData count] > 0 && self.descripData.count>0)
    {
      return [self.storageData count];
    }
     else
     return 1;
 }

同时修改下面的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
----------
        if (self.storageData.count > 0 && self.descripData.count>0) {
------------//Instead of self.storageData>0
        }
----------
}

如果storageData为空,它会解决崩溃问题..!

答案 1 :(得分:0)

这不是真的正确,但由于你的问题是关于使应用程序不崩溃,你可以这样做:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (self.storageData)
        return [self.storageData count];
    else
        return 1;
}

这意味着如果数组不为空,则显示数组中的元素数。否则,只显示1(或任何你想要的默认号码)。

此外,在cellForRowAtIndexPath中,您需要进行相同的检查:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *DoctorsTableIdentifier = @"StorageItemTableViewCell";

    StorageItemTableViewCell *cell = (StorageItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:DoctorsTableIdentifier];
    if (cell == nil)

        {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StorageItemTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
        }

    if (self.storageData)   // <-- check for nil values first
        { if (self.storageData > 0) {
    //more code
    }

同样,不好或不正确,但这会让应用程序崩溃,这就是你所要求的。

答案 2 :(得分:0)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//If "numberOfRowsInSection" return '0' or nil, "cellForRowAtIndexPath" should not be called.
//Are you sure the "self.storageData.count" is empty?
if (_storageData == nil)
{
    return 0;
}
else
{
    return _storageData.count;
}
}

答案 3 :(得分:0)

这是一个问题:

if (self.storageData > 0) {

        noitemsView.hidden = YES;
        ....

您正在比较self.storageData&gt; 0而不是[self.storageData count]&gt; 0,所以if总是评估为true,并且它总是试图用不可用的数据创建一个单元格。

答案 4 :(得分:0)

请尝试以下操作。

self.tableView.dataSource = self.storageData ? self : nil;

答案 5 :(得分:0)

在视图中编写代码加载

self.storageData = [[NSMutableArray alloc] init];

答案 6 :(得分:-1)

您需要在section方法中检查行数中的数组计数: 1.

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 if(!myArray.count)
   return 0;

   return [myArray.count];
}