2016-12-05 10 views
0

私はクラス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:に、tempTitletempContentNSCFConstString "エラー" でありますNSCFString「Duplicate ID」です。

しかし、その後の流れはviewWillAppearになり、両方tempTitletempContentの内容はNSCFStringNSObjectに置き換え、なくなっています。内容はわかりませんが、tempContentの代入エラーが発生しても、tempTitleの割り当てはまだ文字列なので、まだOKです。私もtempContentの値をNSLogできません。

どうしてですか?オブジェクトの内容が変更されない理由は何ですか?

+0

messageTitleとmessageContentがinitWithTitleで初期化されていることを確認していないのはなぜするのに役立ちます。andContentを:? tempTitleとtempContentの必要性を取り除き、コードをより洗練されたIMHOにするでしょう。 – JorisH

+0

@JorisHできません。私が 'pushViewController:animated:'の前に 'messageTitle'と' messageContent'をセットした場合、 'messageTitle'と' messageContent'はまだ空です。その時点でまだオブジェクトがまだ作成または初期化されていないように見えます。オブジェクトを既に完全に初期化しておいた場合は、最初にローカル変数に配置してから、 'viewDidLoad'、' viewWillAppear'、または 'viewDidAppear'のいずれかでinitを実行する必要があります。 –

答えて

1

このようにデータを設定します。

NSString * errorMessage = @"Duplicate ID"; 
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
ErrorMessageViewController * errorMessage = (ErrorMessageViewController *) 
[storyboard instantiateViewControllerWithIdentifier:@"ErrorMessage"]; 
errorMessage.messageTitle = @"Error"; 
errorMessage.messageContent = errorMessage; 
[[self navigationController] pushViewController:errorMessage animated:YES]; 

viewDidLoadまたはviewWillAppearあなたに直接それらの変数を使用します。

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // Use your variables 
} 

編集:

-(void) initTitle:(NSString *)title andContent:(NSString *)content { 
    tempTitle = (title == nil ? @"" : title); 
    tempContent = (content == nil ? @"" : content); 
} 

NSString * errorMessage = @"Duplicate ID"; 
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
ErrorMessageViewController *vc = (ErrorMessageViewController *) 
[storyboard instantiateViewControllerWithIdentifier:@"ErrorMessage"]; 
[vc initTitle:@"Error" andContent:errorMessage]; 
[[self navigationController] pushViewController:vc animated:YES]; 

希望これは

+0

これは機能します!なぜ私のプロパティを設定するメソッドを使用することはできません? –

+0

メソッドを使用してプロパティを設定することはできますが、間違っているのは、そのメソッドで文字列を呼び出すことです。 – CodeChanger

+0

ああ。どうもありがとうございました!! –

1

ストーリーボードは、サブビューをロードするために遅延読み込みを使用します。 messageTitleはと呼ばれると初期化されません。 self.messageTitleを呼び出して、設定値より前にビューを初期化してください。

ErrorMessageViewController * errorMessage = (ErrorMessageViewController *) 
[storyboard instantiateViewControllerWithIdentifier:@"ErrorMessage"]; 

//tempTitle = nil 
// [errorMessage initTitle:@"Error" andContent:contentVar]; 

[[self navigationController] pushViewController:errorMessage animated:YES]; 
// set value after push 
[errorMessage initTitle:@"Error" andContent:contentVar]; 
+0

「call self.messageTitle」とはどういう意味ですか? '[[errorMessage messageTitle] setTitle:]'の前に 'errorMessage.messageTitle;'を最初に呼び出す必要があるのですか? –

+0

ストーリーボードのlazyLoadのためにinstantiateViewControllerWithIdentifierを呼び出すと、messageTitleがnilになると思います。 –

関連する問題