2015-10-05 93 views
0

我试图让我的tableView(初始viewController)刷新时,我从容器中的另一个tableView中选择一行。TableView不调用时调用[tableView reloadData]

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

这是它应该如何工作的:

enter image description here

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(部分已经被省略,BC自己没用)

- (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]; 
}} 

什么是错的家伙?告诉我,我会永远欠债。

谢谢!

回答

1

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

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

在快速阅读代码时,有一件事跳到我身上。

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。

+0

我要试试这个马上,我会向您介绍一个更新!谢谢。 –

相关问题