0

ビュー間でデータを渡す方法を理解するための簡単なアプリケーションを作成しようとしています。私には 2 つの見方があります。最初のビューは、次のメソッドを使用していくつかの文字列を 2 番目のビューに渡します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"colorSegue"]) {

    [segue.destinationViewController setFirstColor:self.favoriteColorTextField.text];
    [segue.destinationViewController setSecondColor:self.secondColor];
    [segue.destinationViewController setDelegate:self];
}

そして、2 番目のビューはこのメソッドでデータを受け取ります。

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 if (self.firstColor != nil && ![self.firstColor isEqualToString:@""]) {
    self.favoriteColorLabel.text = [[NSString alloc] initWithFormat:@"Favorite color: %@", self.firstColor];
 }
 if (self.secondColor != nil && ![self.secondColor isEqualToString:@""]){
    self.secondFavoriteColorLabel.text = [[NSString alloc] initWithFormat:@"Second favorite color: %@", self.secondColor];
 }
}

2 番目のビューは最初の文字列を視覚化します (ただし、2 番目のビューはまだ空であるため、視覚化されません)。次に、2 番目のビューは委譲によって最初のビューに文字列を返します。

- (void)viewWillDisappear:(BOOL)animated
{
[self.delegate setSecondFavoriteColor:self.secondFavoriteColorTextField.text];
}

最初のビューでは、文字列を次のように視覚化します。

- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 if (self.secondColor != nil && ![self.secondColor isEqualToString:@""]) {
    self.secondFavoriteColorLabel.text = [[NSString alloc] initWithFormat:@"Second favorite color: %@", self.secondColor];
 }
}

ここですべてが機能し、最初のビューは両方の文字列を視覚化します。しかし今、私は問題を抱えています。文字列を 2 番目のビューに再度渡そうとすると、最初のビューのみが正しく渡されます。委譲によって値が設定された後でも、2 番目のビューは常に nil 値を持つ secondColor を受け取ります。変数 firstColor および secondColor は、まったく同じ方法で宣言および合成されます。エラーを見つけるのを手伝ってもらえますか?

4

2 に答える 2

0

複数のビュー間でデータを渡したい場合は、これらのオプションがあります。

  • シングルトンを使用できます
  • AppDelegateを使用してください。

シングルトンに関する優れたチュートリアルは次のとおりです。

http://www.galloway.me.uk/tutorials/singleton-classes/

AppDelegateを使用して次のようにする場合:

AppDelegate.h

@property (nonatomic, retain) NSString *something;

AppDelegate.m

@synthesize something;

FirstViewController.m

#import "AppDelegate.h";

(void) setSomething {
       AppDelegate *AppDelegate = [[UIApplication sharedApplication] delegate];
       AppDelegate.something = @"something";

}

SecondviewController.m

#import "AppDelegate.h";

(void) getSomething {
       AppDelegate *AppDelegate = [[UIApplication sharedApplication] delegate];
       label.text = AppDelegate.something;

}
于 2013-02-05T16:06:11.683 に答える
0

segue.destinationViewController を SecondViewController クラスに変換する必要があると思います

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"colorSegue"]) {
        SecondViewController *svc = [segue destinationViewController];
        [svc setFirstColor:self.favoriteColorTextField.text];
        [svc setSecondColor:self.secondColor];
        [svc setDelegate:self];
}

また

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"colorSegue"]) {

        [(SecondViewController *)segue.destinationViewController setFirstColor:self.favoriteColorTextField.text];
        [(SecondViewController *)segue.destinationViewController setSecondColor:self.secondColor];
        [(SecondViewController *)segue.destinationViewController setDelegate:self];
}
于 2013-02-05T15:38:24.190 に答える