簡體   English   中英

嘗試滾動時,UITableView自定義單元格消失

[英]UITableView custom cells disappear when trying to scroll

我有一個UITableViewController,它具有帶有自定義單元格的表視圖(它們具有子類和xib)。 問題是我從博客加載數據並顯示確定,但是當我嘗試滾動或觸摸時,單元格會重置,就像它們沒有加載一樣。

這是它出現的方式: 在此輸入圖像描述

當我嘗試滾動時會發生這種情況: 在此輸入圖像描述

這是我的View Controller代碼:

#import "TLDRCategoryViewController.h"

@interface TLDRCategoryViewController ()
@property(nonatomic,strong) IBOutlet UIView *headerView;
@property(nonatomic,strong) NSMutableArray *posts;
@property(nonatomic, assign, readonly) TLDRTag category;
@property(nonatomic, strong) IBOutlet UILabel *category_label;
@end

@implementation TLDRCategoryViewController
@synthesize headerView = _headerView, posts = _posts, category = _category, category_label = _category_label;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

-(void)setCategory:(TLDRTag)_cat {
    _category = _cat;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.tableHeaderView = _headerView;

    _category_label.text = [TLDRHelper showableNameForTag:_category];
    _category_label.textColor = [TLDRHelper colorForTag:_category];

    TLDRRetriever *retriever = [[TLDRRetriever alloc] initWithDelegate:self];
    [retriever postsByCategory:_category];
    if (_posts == nil)
        _posts = [[NSMutableArray alloc] init];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)postsLoaded:(NSDictionary *)postsDict {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) {
        for (NSDictionary *key in postsDict[@"response"][@"posts"]) {
            TLDRNewsItem *newsPost = [[TLDRNewsItem alloc] initWithDictionary:key];
            [self.posts addObject:newsPost];
        }
        dispatch_sync(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
        });

    });

}


#pragma mark - Table view data source

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

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

    // Return the number of rows in the section.
    return [self.posts count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"TLDRNewsCell";

    TLDRNewsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TLDRNewsCell" owner:nil options:nil];
        for(id currentObject in topLevelObjects) {
            if([currentObject isKindOfClass:[TLDRNewsCell class]]) {
                cell = (TLDRNewsCell *)currentObject;
                break;
            }
        }
    }


    cell.title.text = ((TLDRNewsItem*)self.posts[indexPath.row]).articleTitle;
    cell.content.text = ((TLDRNewsItem*)self.posts[indexPath.row]).articleTLDR;

    return cell;
}

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *text = ((TLDRNewsItem*)self.posts[indexPath.row]).articleTLDR;

    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];

    return textSize.height + PADDING * 3;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}

這是TLDRRetriever的相關部分:

-(void)postsByCategory:(NSInteger)cat {
    NSString *string_cat = @"";

    switch (cat) {
        case TLDRTagWorldNews:
            string_cat = @"world%20news";
            break;
        case TLDRTagBusiness:
            string_cat = @"business";
            break;
        case TLDRTagDesign:
            string_cat = @"design";
            break;
        case TLDRTagEntertainment:
            string_cat = @"entertainment";
            break;
        case TLDRTagFacts:
            string_cat = @"facts";
            break;
        case TLDRTagHealth:
            string_cat = @"health";
            break;
        case TLDRTagPolitics:
            string_cat = @"politics";
            break;
        case TLDRTagScience:
            string_cat = @"science";
            break;
        case TLDRTagSports:
            string_cat = @"sports";
            break;
        case TLDRTagTech:
            string_cat = @"tech";
            break;
        case TLDRTagWeb:
            string_cat = @"web";
            break;

        default:
            string_cat = @"";
            break;
    }

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", kTLDRAPIURLCats, string_cat]]];
        NSError *error;
        NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        [[self delegate] postsLoaded:json];

    });



}

我在該應用程序上也有一個幾乎精確的視圖控制器,它工作正常(我正在使用該控制器的大部分代碼,並且這個可以重用於其他類似的類別)。 該控制器是批量分配的(我分配了11個控制器並將它們保存在一個數組中)。 我無法調試這個,所以我不知道發生了什么。 代碼中有什么問題嗎? 謝謝!

修復程序與控制器或類似的東西無關:它是根視圖控制器。 視圖沒有保留在內存中,所以我只為每個控制器制作了一個ivar而不是循環它們並修復了應用程序:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM