Пустой UITableViewController с асинхронными вызовами - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над использованием сериализации NSURLSession и JSON для получения контента с моего сайта.Асинхронные вызовы и получение данных JSON работают отлично.Моя проблема в том, что когда дело доходит до отображения данных в TableviewController, я помещаю оператор NSLog, чтобы увидеть, есть ли данные и есть, но этот cell.textlable.text никогда не обновляется.Я предполагаю, что проблема - темы, но я не могу понять это.Вы можете помочь?

@interface MainTableViewController : 
UITableViewController<LokalModelProtocol>


@property (strong,nonatomic) NSMutableArray* arr;

@end

@implementation MainTableViewController
 @synthesize arr;

- (void)viewDidLoad {
[super viewDidLoad];
arr = [[NSMutableArray alloc]init];
LokalModel *lokal = [[LokalModel alloc]init];
lokal.delegate=self;
[lokal downloadItems];

}

-(void)itemsDownloaded:(NSMutableArray *)items
{
arr=items;
//NSLog(@"%@", items);
[self.tableView reloadData];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
#warning Incomplete implementation, return the number of sections
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section {
#warning Incomplete implementation, return the number of rows
// return 1;

return [arr count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mainCell" forIndexPath:indexPath];

PostModel *post = [[PostModel alloc]init];
post =[arr objectAtIndex:indexPath.row];


NSLog(@"%@", post.postTitle); ////this outputs the correct strings///////

cell.textLabel.text =[NSString stringWithFormat:@"%@", post.postTitle];
cell.detailTextLabel.text = post.postTitle;///neither of these do//////

return cell;
}

@end





@protocol LokalModelProtocol <NSObject,NSURLSessionDelegate>

+(void)itemsDownloaded:(NSMutableArray*)items;

@end

@interface LokalModel : NSObject

-(void)downloadItems;
@property (strong, nonatomic) NSMutableData* thedata;
@property (strong, nonatomic) NSString* urlString;
@property (strong, nonatomic) NSURL* theUrl;
@property (strong,nonatomic) id<LokalModelProtocol>delegate;
+(void)parseJson:(NSData*)data;

@end





id<LokalModelProtocol>delegate;

@implementation LokalModel;
@synthesize thedata,urlString,theUrl,delegate;

-(void)downloadItems{
NSURL *theUrl = nil;
static NSString* urlString = @"https://balalatet.com/wp-json/wp/v2/posts";
theUrl=[NSURL URLWithString:urlString];

NSURLSession *currentSession= [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *task = [currentSession dataTaskWithURL:theUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error){
        [NSException raise:@"error" format:@"%@",error.localizedDescription];
        NSLog(@"error1");
    }
    else{
        NSLog(@"success");
        [LokalModel parseJson:data];

    }


}];
[task resume];

}

+(void)parseJson:(NSData*)data{

NSArray *jsonResults = [[NSArray alloc]init];
NSError *jsonerror;
jsonResults =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonerror];

if (jsonerror)
    [NSException raise:@"json error" format:@"%@",jsonerror.localizedDescription];

NSMutableArray *posts = [[NSMutableArray alloc] init];
NSMutableDictionary *jsonElenent =[NSMutableDictionary dictionary];

for (NSMutableDictionary *d in jsonResults)
{
    jsonElenent=d;
    PostModel *thePost=[[PostModel alloc]init];
    thePost.postId= jsonElenent[@"id"];
    thePost.postDate= jsonElenent[@"date"];
    thePost.postDategmt= jsonElenent[@"date_gmt"];
    thePost.postGuid= jsonElenent[@"guid"];
    thePost.postSlug= jsonElenent[@"slug"];
    thePost.postStatus= jsonElenent[@"status"];
    thePost.postSticky= jsonElenent[@"sticky"];
    thePost.postPingStatus= jsonElenent[@"ping_status"];
    thePost.postType= jsonElenent[@"type"];
    thePost.postCommentStatus= jsonElenent[@"comment_status"];
    thePost.postTags= jsonElenent[@"tags"];
    thePost.postTitle= jsonElenent[@"title"];
    thePost.postTemplate= jsonElenent[@"template"];
    thePost.postLink= jsonElenent[@"link"];
    thePost.postMeta= jsonElenent[@"meta"];
    thePost.postModified= jsonElenent[@"modified"];
    thePost.postModifiedgmt= jsonElenent[@"modified_gmt"];
    thePost.postFeaturedMedia= jsonElenent[@"featured_media"];
    thePost.postFormat= jsonElenent[@"format"];
    thePost.postLinks= jsonElenent[@"links"];
    thePost.postAuthor= jsonElenent[@"author"];
    thePost.postContent= jsonElenent[@"content"];
    thePost.postCategory= jsonElenent[@"category"];
    thePost.postExcerpt= jsonElenent[@"excerpt"];
    NSLog(@"%@", thePost.postTitle);
    [posts addObject:thePost];
}
dispatch_async(dispatch_get_main_queue(), ^{
    [delegate itemsDownloaded:posts];
});
}
@end

Обновление

мои извинения как часть моей информации об отладке неверны.вывод nslog не был получен из метода cellForRowAtIndexPath.на самом деле массив arr остается пустым, потому что элементы (void) itemsDownloaded: (NSMutableArray *) никогда не вызываются.Я уверен, что я правильно настроил протокол.какие-либо мысли о том, почему MainTableViewControllerClass не может получить данные?

update

, поэтому я понял, что забыл удалить строку

id<LokalModelProtocol>delegate;

, которую я поставил перед @реализация в LokalModel.но теперь это вызывает ошибку «нераспознанный селектор, отправленный экземпляру» в строке

[delegate itemsDownloaded:posts];

Я также пытался

[self.delegate itemsDownloaded:posts];

, но выдает то же исключение.

Решено

Мой метод протокола должен был быть методом экземпляра, и я установил его как метод класса.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я полагаю, вам необходимо добавить registerNib:forCellReuseIdentifier: или registerClass:forCellReuseIdentifier: перед использованием dequeueReusableCellWithIdentifier:forIndexPath: (например, в viewDidLoad)

Из документации: https://developer.apple.com/documentation/uikit/uitableview/1614878-dequeuereusablecellwithidentifie?language=objc

Внимание! Перед вызовом этого метода необходимо зарегистрировать файл класса или пера, используя registerNib: forCellReuseIdentifier: или registerClass: forCellReuseIdentifier: метод.

0 голосов
/ 22 октября 2018

Перед возвращением ячейки добавьте, попробуйте добавить этот код в cellForRowIndexPath

[cell layoutIfneeded];

...