我是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()没有用。帮助我..提前致谢..
答案 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”