2017-10-25 13 views
1

私はiOS開発とオーバーフローを抱えています。私は、複数のUILabelとUITextFieldにユーザのデータを表示する必要があり、データはPOSTメソッドから取得されます。サーバーからデータを取得するのに少し時間がかかります。詳細を取得した後に要素を再読み込みまたは埋め込む方法。 これは私がコードを使用してサーバからデータを受信)(jsonからデータを取得した後で、データをUILabelsとUITextFieldにロードする

@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で、私は(の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()がうまくいきませんでした。

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

また、あなたが見つけるかもしれない:それはあなたの場合(!ERROR2 = nilの)文の他の枝のようなコードを追加し、かなり簡単です

+0

ことを確認してください。これらのラベルを最初から隠しておき、データがロードされたときにデータを割り当ててラベルを表示するか、何らかのアクシビティインジケータを使って何かが起きていることを示すことができます。 – Dalvik

+0

データを受け取ってからuielementsを読み込むまでラベルを隠すにはどうすればいいですか? – alpha47

答えて

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


} 

はすべてがあなたのrequrementに依存して多くの方法がありますが名前UIButtonボタン、すなわち「calButton」ない「calField」

1

..事前に感謝を私を助けてそれは現在のViewControllerを閉じますように、その枝から、この文を削除するために必要なこと:

[self dismissViewControllerAnimated:alert completion:nil]; 

そして、私はあなたがメモリリークを防ぐために、ブロックの内側にweakSelf使用する必要がある、と指摘することがあります。ブロック内で自己を使用すると、保持サイクルが作成されます。これは、iOSが最終的に過剰なメモリ使用をクラッシュさせるまで、viewController全体が割り当てられたままであることを意味します。

これをメソッドの一番上に置き、ブロック内でアクセス可能にしてから、ブロック内部の自己参照をweakSelfに変更します。

typeof(self) __weak weakSelf = self; 
+0

はすばやい応答を感謝します..私はそれにデータを読み込むことができます前に、uielementsが読み込まれていない疑いがありますか?データの取得に若干の遅延が生じます。どのように要素を再読み込みするのですか?または_weak変数は直ぐにuitextフィールドにアクセスした後にデータをロードしますか? – alpha47

+1

viewDidLoadまたはviewWillAppearのいずれかからPOSTリクエストを呼び出すメソッドを呼び出す場合は、アウトレットへの接続が適切に設定されている必要があります。 しかし、考えてみると、完了ブロックはバックグラウンドスレッドから呼び出される可能性があるので、UIアップデートを次の場所にラップしてください:dispatch_async(dispatch_get_main_queue()、^ {insert-ui-update-code>}); UIKitはメインスレッドからのみ呼び出すことができるためです。 – CodeWriter23

+1

私はアレンの答えを試した、それは働いた – alpha47

関連する問題