【问题标题】:TableView not reloading when calling [tableView reloadData]调用 [tableView reloadData] 时 TableView 未重新加载
【发布时间】:2015-10-05 18:36:24
【问题描述】:

当我从容器中的另一个 tableView 中选择一行时,我试图让我的 tableView(初始 viewController)刷新。

选择该行后,它会解析来自 Web 服务器的 JSON 文件,将其保存并存储在 docs 目录中。主视图中的 tableView 应该使用新的 JSON 文件重新加载。

它应该是这样工作的:

OpenWorkViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath (NSIndexPath *)indexPath{

PFQuery *query = [PFQuery queryWithClassName:@"Travaux"];
[query whereKey:@"profID" equalTo:@"EAPFfaGSOE"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"form.json"];

        for (PFObject *object in objects) {

            PFFile *file = object[@"json"];

            [file getDataInBackgroundWithBlock:^(NSData *jsonData, NSError *error) {
                if (!error) {
                    self.jsonData = jsonData;
                }
            }];
        }

        [self.jsonData writeToFile:appFile atomically:YES];
        ViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
        [vc viewDidLoad];

    } else {
        // Log details of the failure
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }
}];}

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
    {
    UITableView *form;
    }

@property CGFloat shortQuestion;
@property CGFloat choiceQuestion;
@property CGFloat multipleQuestion;

@property (strong, nonatomic) NSMutableArray *numbersCell;
@property (strong, nonatomic) NSMutableArray *questionType;
@property (strong, nonatomic) NSMutableArray *inputsArray;
@property (strong, nonatomic) NSMutableDictionary *inputsDict;
@property (strong, nonatomic) NSString *indexAnswer;
@property (strong, nonatomic) NSString *formData;

-(void)readQuestions:(NSString *)path;

@end

ViewController.m(部分已被省略,因为它们没用)

- (void)viewDidLoad {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"form.json"];
//NSLog(@"%s  === %@", __PRETTY_FUNCTION__, filePath);
self.formData = filePath;
[self readQuestions:filePath];

UIView *shortView = [[[NSBundle mainBundle] loadNibNamed:@"ECFormShortQuestion" owner:self options:nil] objectAtIndex:0];
self.shortQuestion = [shortView bounds].size.height;

UIView *choiceView = [[[NSBundle mainBundle] loadNibNamed:@"ECFormChoiceQuestion" owner:self options:nil] objectAtIndex:0];
self.choiceQuestion = [choiceView bounds].size.height;

UIView *multipleView = [[[NSBundle mainBundle] loadNibNamed:@"ECFormMultipleQuestion" owner:self options:nil] objectAtIndex:0];
self.multipleQuestion = [multipleView bounds].size.height;

self.automaticallyAdjustsScrollViewInsets = NO; //important


[super viewDidLoad];}

-(void)readQuestions:(NSString *)path
    {
//NSString *filePath =[[NSBundle mainBundle] pathForResource:@"input" ofType:@"json"];

self.numbersCell = [[NSMutableArray alloc] init];
self.questionType = [[NSMutableArray alloc] init];
self.inputsArray = [[NSMutableArray alloc] init];
self.inputsDict = [[NSMutableDictionary alloc] init];

if ([path length])
{
    NSError *readError;
    NSData *questionsData = [[NSData alloc] initWithContentsOfFile:path options:NSMappedRead error:&readError];


    if (!readError)
    {
        NSError *parseError;
        NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:questionsData options:NSJSONReadingMutableContainers error:&parseError];

        if (!parseError && dictionary)
        {
            NSMutableDictionary *questionsDictionary = [dictionary objectForKey:@"questions"];
            int number= -1; // Question number
            //NSLog(@"%@",questionsDictionary);
            for (NSMutableDictionary *singleQuestion in questionsDictionary)
            {
                NSString *questionType = [singleQuestion objectForKey:@"type"];
                NSString *questionTitle = [singleQuestion objectForKey:@"title"];
                NSMutableDictionary *inputs = [singleQuestion objectForKey:@"inputs"];
                NSMutableArray *a = [NSMutableArray array];

                for (NSDictionary *d in inputs)
                {
                    NSArray *arr = [d allKeys];
                    NSString *theKey = [arr lastObject];
                    [a addObject:theKey];
                }

                self.indexAnswer = [NSString stringWithFormat:@"%d", ++number];

                for (int i = 1;i<=[a count];i++)
                {
                    [self.inputsDict setObject:a forKey:self.indexAnswer];

                }

                [self.numbersCell addObject:questionTitle];
                [self.questionType addObject:questionType];

            }

        }
    }
    form=[[UITableView alloc]init];
    form.frame = CGRectMake(0,64,700,704);
    form.dataSource=self;
    form.delegate=self;
    form.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    [self.view addSubview:form];

    [form reloadData];
}}

你们怎么了?!告诉我,我将永远负债累累。

谢谢!

【问题讨论】:

    标签: ios objective-c json uitableview


    【解决方案1】:

    这可能是因为您在后台线程上呈现视图控制器。尝试在主运行循环中呈现它:

    [self.jsonData writeToFile:appFile atomically:YES];
    dispatch_async(dispatch_get_main_queue(), ^{
        ViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
        [vc viewDidLoad];
    });
    

    【讨论】:

      【解决方案2】:

      快速阅读代码后,我突然想到了一件事。

      for (PFObject *object in objects) {
      
              PFFile *file = object[@"json"];
      
              [file getDataInBackgroundWithBlock:^(NSData *jsonData, NSError *error) {
                  if (!error) {
                      self.jsonData = jsonData;
                  }
              }];
          }
      
          [self.jsonData writeToFile:appFile atomically:YES];
          ViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
          [vc viewDidLoad];
      

      我假设 getDataInBackgroundWithBlock 是异步的,这意味着当您到达最后三行时,jsonData 实际上可能不包含任何信息。

      你应该在块中添加一些代码来保存数据,然后确保在加载完所有内容后才加载新的vc。

      【讨论】:

      • 我马上试试这个,我会向你简要介绍一个更新!谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多