[英]TableView not reloading when calling [tableView reloadData]
當我從容器中的另一個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];
}}
伙計們怎么了? 告訴我,我將永遠負債累累。
謝謝!
快速閱讀代碼可以使我想到一件事。
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。
可能是因為您要在后台線程上顯示視圖控制器。 嘗試將其呈現在主運行循環上:
[self.jsonData writeToFile:appFile atomically:YES];
dispatch_async(dispatch_get_main_queue(), ^{
ViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
[vc viewDidLoad];
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.