2015-11-02 3 views
-1

Я использую приведенный ниже код в своем ViewController.m для входа пользователя в мое приложение. Однако на следующем ViewController (AccountViewController) у меня есть tableView. После успешного входа в систему я хочу перезагрузить/заполнить данные в таблицеView, но вместо успешного входа в систему я получаю пустую таблицу. Я положил reloadData в viewWillAppear в верхней части MyAccountViewController. Смотри ниже. Не уверен, почему он это делает, поскольку, когда я перемещаюсь с AccountViewController на другой экран и обратно, таблица заполняется. Является ли мой бит AFNetworking причиной того, что таблица почему-то не заполняется?tableview reloadData не работает после успешного входа в систему/AFNetworking

ViewController.m

[DIOSUser userLoginWithUsername:_userField.text 
        andPassword:_passField.text 
         success:^(AFHTTPRequestOperation *op, id response) { 
          // Saving to keychain/NSUserDefaults 

          NSDictionary *diosSession = [[DIOSSession sharedSession] user]; 

          [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:diosSession] forKey:@"diosSession"]; 

          [[NSUserDefaults standardUserDefaults] synchronize]; 
          [[DIOSSession sharedSession] getCSRFTokenWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
           NSString *csrfToken = [NSString stringWithUTF8String:[responseObject bytes]]; 
           [[NSUserDefaults standardUserDefaults] setObject:csrfToken forKey:@"diosToken"]; 
           [[NSUserDefaults standardUserDefaults] synchronize]; 
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
           // failure handler 
          }]; 

          wrongLogin.hidden = YES; 
          UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
          MyAccountViewController *yourViewController = (MyAccountViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MyAccount"]; 
          [self.navigationController pushViewController:yourViewController animated:YES]; 

          [self.activityIndicatorViewOne stopAnimating]; 
          self.activityIndicatorViewOne.hidden = YES; 


          NSLog(@"Success!");} 

         failure:^(AFHTTPRequestOperation *op, NSError *err) { NSLog(@"Fail!"); wrongLogin.hidden = NO; } 
]; 

AccountViewController.m

 - (void)viewWillAppear:(BOOL)animated { 

     [self.tableView reloadData]; 

     } 
    - (void)viewDidLoad { 
     [super viewDidLoad]; 

      [self.tableView reloadData]; 

     if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) 
      self.edgesForExtendedLayout = UIRectEdgeNone; 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(ReloadDataFunction:) 
                name:@"refresh" 
                object:nil]; 


     [self.tableView reloadData]; 

     self.descripData = [[NSMutableArray alloc] init]; 


     UIBarButtonItem *flipButton = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"logouticon4.png"] 
            // initWithTitle:@"Logout" 
             style:UIBarButtonItemStylePlain 
             target:self 
             action:@selector(flipView)]; 
     self.navigationItem.rightBarButtonItem = flipButton; 
     [flipButton release]; 


     self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; 

     [self.navigationItem setHidesBackButton:YES animated:YES]; 

     refreshControl = [[UIRefreshControl alloc]init]; 
     [self.tableView addSubview:refreshControl]; 
     [refreshControl addTarget:self action:@selector(refreshTable) forControlEvents:UIControlEventValueChanged]; 


     // Do any additional setup after loading the view. 
     self.storageData = [[NSMutableDictionary alloc] init]; 
     userName.text = [[[DIOSSession sharedSession] user] objectForKey:@"name"]; 
     //emailAddress.text = [[[DIOSSession sharedSession] user] objectForKey:@"mail"]; 
     NSLog(@"%@", [[DIOSSession sharedSession] user]); 



     // DIOSView *view = [[DIOSView alloc] init]; 
      NSMutableDictionary *viewParams = [NSMutableDictionary new]; 
      [viewParams setValue:@"storeditems" forKey:@"view_name"]; 
      [DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      self.descripData = [responseObject mutableCopy]; 
       NSLog(@"%@",self.descripData); 



     //  [self.tableView reloadData]; 
     // [HUD hide:YES]; 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"Failure: %@", [error localizedDescription]); 
     }]; 



     [DIOSNode nodeIndexWithPage:@"0" fields:@"title" parameters:[NSArray arrayWithObjects:@"storage_item", nil] pageSize:@"20" success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSLog(@"Nodes retrieved!"); 
      __block int iCount = 0; 

      for (id object in responseObject) { 
      // NSLog(@"adding object!"); 
       [self.storageData setObject:(NSDictionary *)object forKey:[NSString stringWithFormat:@"%d",iCount]]; 
       iCount++; 

       [self.tableView reloadData]; 
      } 


     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      //failure 
     }]; 


    } 

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

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if ([self.storageData count] > 0 && self.descripData.count > 0) 
    { 
     return [self.descripData count]; 
    } 

    else 

     return 0; 
} 



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

    static NSString *DoctorsTableIdentifier = @"StorageItemTableViewCell"; 

    StorageItemTableViewCell *cell = (StorageItemTableViewCell *)[tableView dequeueReusableCellWithIdentifier:DoctorsTableIdentifier]; 
    if (cell == nil) 

     { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StorageItemTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
     } 

    if (self.storageData.count > 0 && self.descripData.count > 0) { 

     noitemsView.hidden = YES; 

     cell.cellCountLabel.text = [NSString stringWithFormat:@"%i", indexPath.row+1]; 

     NSDictionary *title = [self.descripData objectAtIndex:indexPath.row]; 
     [[cell itemName] setText:[title objectForKey:@"node_title"]]; 

     NSDictionary *node = [self.descripData objectAtIndex:indexPath.row]; 
      [[cell itemDescrip] setText:[node objectForKey:@"body"]]; 

     NSDictionary *value = [self.descripData objectAtIndex:indexPath.row]; 
     [[cell valueLabel] setText:[value objectForKey:@"storeditemvalue"]]; 
      NSLog(@"%@", self.descripData); 

    NSDictionary *quantity = [self.descripData objectAtIndex:indexPath.row]; 
     [[cell quantityLabel] setText:[quantity objectForKey:@"numberofitemstored"]]; 
     NSLog(@"%@", self.descripData); 

      NSString *secondLink = [[self.descripData objectAtIndex:indexPath.row] objectForKey:@"photo"]; 

      [cell.itemPhoto sd_setImageWithURL:[NSURL URLWithString:secondLink]]; 

      NSLog(@"%@",secondLink); 


       } 

    else { 
     noitemsView.hidden = NO; 
    } 

       return cell; 
       } 
+0

reloadData в ViewWillAppear ничего не сделает ... он уже загружается. Где код, который предоставляет данные tableView? Как узнать, что нужно обновить? Вам потребуется какая-то синхронизация с хранилищем данных в представлении AccountViewControllerWillAppear. – Tim

+0

@Tim См. Отредактированный код выше. Мои данные обновляются после того, как пользователь отключится в подкатегории tableView (refreshControl). – Brittany

ответ

0

У вас есть "освежить" наблюдатель, но он вызывает функцию, которую вы не показано здесь. Вы можете установить данные, похоже, с этим:

for (id object in responseObject) { 
     // NSLog(@"adding object!"); 
      [self.storageData setObject:(NSDictionary *)object forKey:[NSString stringWithFormat:@"%d",iCount]]; 
      iCount++; 

      [self.tableView reloadData]; 
     } 

, но потому, что в viewDidLoad, она вызывается только один раз перед viewWillAppear. Вам нужно заполнить self.storageData и self.descripData в отдельной функции, затем вызвать функцию THAT из viewWillAppear или использовать уведомление NSNotificationCenter из предыдущего VC.

+0

Используется NSNotificationCenter для выполнения вышеуказанного в viewWillAppear. Работает как шарм :) Спасибо. – Brittany