从json获取数据后,将数据加载到UILabels和UITextFields

时间:2017-10-25 18:55:54

标签: ios objective-c json

我是iOS开发的新手,也是堆栈溢出的新手。我需要在多个UILabel和UITextField中显示用户的数据,数据是从POST方法获得的。从服务器获取数据有一点延迟。如何在获取详细信息后重新加载或填充元素。 这是我的viewDidLoad()

@interface EditProfileViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *displayPictureView;
@property (weak, nonatomic) IBOutlet UITextField *firstnameFeld;
@property (weak, nonatomic) IBOutlet UITextField *lastNameField;
@property (weak, nonatomic) IBOutlet UITextField *emailField;
@property (weak, nonatomic) IBOutlet UITextField *bdayField;
@property (weak, nonatomic) IBOutlet UIButton *calField;
@property (weak, nonatomic) IBOutlet UITextView *addressTextView;
@property (weak, nonatomic) IBOutlet UILabel *userIDLabel;
@property (weak, nonatomic) IBOutlet UILabel *phoneNumberLabel;
@property (weak, nonatomic) IBOutlet UIScrollView *editScrollView;
@end

@implementation EditProfileViewController

- (void)viewDidLoad {
     [super viewDidLoad];

     self.editScrollView.delegate=self;
}

我使用代码从服务器接收数据,我在viewDidLoad()中有这个POST方法

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:urlEdit];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[editParameters dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
                                                   completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
     NSLog(@"Response:%@ \nError:%@\n", response, error);
     if(error == nil)
     {
      NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
      NSLog(@"DataText = %@",text);
      }
      NSError *error2 = nil;
      jsonDicEditAcc = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error2];
      if (error2 != nil) {
             NSLog(@"Error parsing JSON.");
        }
      else {
        NSLog(@"JsonDictEditAcc: \n%@",jsonDicEditAcc);

        [self dismissViewControllerAnimated:alert completion:nil];}
         }];
[dataTask resume];

我将从“jsonDicEditAcc”中提取数据,我需要知道如何在获取数据后填充UILabels和UITextField,因为视图在获取数据之前已加载。我试过viewWillAppear()没有用。帮助我..提前致谢..

2 个答案:

答案 0 :(得分:1)

非常简单,将相似的代码添加到 if(error2!= nil)语句的else分支中:

weakSelf.firstnameFeld = jsonDicEditAcc[@"<key-for-firstname>"];

此外,您可能会发现有必要从该分支中​​删除此语句,因为它将关闭当前的viewController:

[self dismissViewControllerAnimated:alert completion:nil];

我可能会指出,你需要在块内部使用weakSelf来防止内存泄漏。在块内使用self会创建一个保留周期,这意味着您的整个viewController将保持分配状态,直到iOS最终崩溃您的应用程序以过度使用内存。

将它放在方法的顶部,可以在块内访问,然后将块内的self的所有引用更改为weakSelf。

typeof(self) __weak weakSelf = self;

答案 1 :(得分:1)

您需要知道您尝试应用的数据的内容。如果您知道与每个值关联的键,则可以将这些值应用于文本字段(以及标签和按钮)并完成。当您成功更新它们时,它们会发生变化。

在块中,您需要触发文本字段的填充。您可以添加以下内容:

      else {
    NSLog(@"JsonDictEditAcc: \n%@",jsonDicEditAcc);

    [self updateLabelsAndTextFields];

    [self dismissViewControllerAnimated:alert completion:nil];}
     }];

此函数将从jsonDicEditAcc中提取数据并更新每个相关UILabel的文本。视图已加载,但更改文本时UILabel将更新。

解决方案可能如下所示:

- (void)updateLabelsAndTextFields{
    self.firstnameFeld.text = jsonDicEditAcc[@"key"];
    self.lastNameField.text = jsonDicEditAcc[@"key"];
    self.emailField.text = jsonDicEditAcc[@"key"];
    self.bdayField.text = jsonDicEditAcc[@"key"];
    self.userIDLabel.text = jsonDicEditAcc[@"key"];
   [calField setTitle:jsonDicEditAcc[@"key"] forState:UIControlStateNormal];


}

确保将UIButton命名为a按钮,即“calButton”而不是“calField”