私はクラスErrorMessageViewController
持っている:インスタンス化されたビューコントローラでコントロールを正しく初期化する方法はありますか?
// ErrorMessageViewController.h
@interface ErrorMessageViewController: UIViewController {
NSString * tempTitle;
NSString * tempContent;
}
@property (nonatomic, strong) IBOutlet UILabel* messageTitle;
@property (nonatomic, strong) IBOutlet UILabel* messageContent;
-(void) initTitle:(NSString *)title andContent:(NSString *)content;
@end
// ErrorMessageViewController.m
@implementation ErrorMessage
@synthesize messageTitle, messageContent;
-(void) initTitle:(NSString *)title andContent:(NSString *)content {
tempTitle = title == nil ? @"" : title;
tempContent = content == nil ? @"" : content;
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (messageTitle != nil) { [messageTitle setText:tempTitle]; }
if (messageContent != nil) { [messageContent setText:tempContent]; }
}
@end
をそして、私はこのコードを使用してディスプレイにそれを置く:
NSString * errorMessage = @"Duplicate ID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ErrorMessageViewController * errorMessage = (ErrorMessageViewController *)
[storyboard instantiateViewControllerWithIdentifier:@"ErrorMessage"];
[errorMessage initTitle:@"Error" andContent:contentVar];
[[self navigationController] pushViewController:errorMessage animated:YES];
私はそれをデバッグする場合、initTitle:Content:
に、tempTitle
とtempContent
がNSCFConstString
"エラー" でありますNSCFString
「Duplicate ID」です。
しかし、その後の流れはviewWillAppear
になり、両方tempTitle
とtempContent
の内容はNSCFString
とNSObject
に置き換え、なくなっています。内容はわかりませんが、tempContentの代入エラーが発生しても、tempTitleの割り当てはまだ文字列なので、まだOKです。私もtempContent
の値をNSLogできません。
どうしてですか?オブジェクトの内容が変更されない理由は何ですか?
messageTitleとmessageContentがinitWithTitleで初期化されていることを確認していないのはなぜするのに役立ちます。andContentを:? tempTitleとtempContentの必要性を取り除き、コードをより洗練されたIMHOにするでしょう。 – JorisH
@JorisHできません。私が 'pushViewController:animated:'の前に 'messageTitle'と' messageContent'をセットした場合、 'messageTitle'と' messageContent'はまだ空です。その時点でまだオブジェクトがまだ作成または初期化されていないように見えます。オブジェクトを既に完全に初期化しておいた場合は、最初にローカル変数に配置してから、 'viewDidLoad'、' viewWillAppear'、または 'viewDidAppear'のいずれかでinitを実行する必要があります。 –