-1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    // If break in here, url fetch maybe error or row is null
    RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];

    cell.title.text = feed.title;
    cell.description.text = feed.description;
    cell.date.text = feed.date;
    // if any image enclosure at rss parse
    [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue,
                   ^{
                       UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                       [cell.enclosure  setImage:image];
                       [cell setNeedsLayout];
                   });

    return cell;
}

RSS の空の行を取得しようとすると問題が発生します (Web カテゴリに投稿がありません)

アラートを表示して自動的にメイン ページに移動したい。

ここに立ち往生。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    @try {
        NSLog(@"Trying to tetch");
        // If break in here, url fetch maybe error or empty row
        RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];
        cell.title.text = feed.title;
        cell.description.text = feed.description;
        [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue,
                       ^{
                           UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                           [cell.enclosure  setImage:image];
                           [cell setNeedsLayout];
                       });

        return cell;

    }
    @catch (NSException *e) {
        NSLog(@"catching %@ reason %@", [e name], [e reason]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"%@",e] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];

        TableViewController *VC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
        [self presentViewController:VC animated:YES completion:nil];
    }
    @finally {
        NSLog(@"finally");
    }
}

アラートが表示されず、ブレークポイントに移動します。このエラーをどのように処理すればよいですか?

4

1 に答える 1

3

まず、常に UITableViewCell* at を返す必要がありますcellForRowAtIndexPath:。第 2 に、これは一般的に悪い習慣であり (以下の引用を参照)、特にいくつかのアラートを表示してTableViewController何度も提示する可能性があるためです。self.manager.feedsそして、問題解決策としては、実はと思わせる例外はないようですnil


Objective-C を使用したプログラミング

Objective-C メソッドの標準プログラミング チェックの代わりに try-catch ブロックを使用しないでください。たとえば、NSArray の場合、特定のインデックスでオブジェクトにアクセスする前に、常に配列のカウントをチェックしてアイテムの数を判断する必要があります。objectAtIndex: メソッドは、開発サイクルの早い段階でコードのバグを見つけることができるように、範囲外の要求を行うと例外をスローします。ユーザーに出荷するアプリで例外をスローすることは避ける必要があります。

Objective-C アプリケーションの例外の詳細については、「 例外プログラミングのトピック」を参照してください。

于 2013-06-17T10:05:08.333 に答える