1

私の提示ビューコントローラには、次の prepareForSegue 関数があります

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([[segue identifier] isEqualToString:@"goToView2"]){
        ViewController2 *controller2 = [segue destinationViewController];
        controller2.multiplierStepper.value = 7.0;
        controller2.randomString = @"string set from Scene 1";
    }
}

ViewController2 には、UIStepper の値と NSString のアウトレットがあります

@property (strong, nonatomic) IBOutlet UIStepper *multiplierStepper;
@property (strong, nonatomic) NSString *randomString;

ViewController2.m viewDidLoad では、表示中のビュー コントローラーによって上記で設定された値をテストしています。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.        
    NSLog(@"in viewDidLoad: self.multiplierStepper.value: %f", self.multiplierStepper.value);
    NSLog(@"in viewDidLoad: randomstring: %@", self.randomString);
}

コンソール出力は NSString に対して適切に機能しますが、UIStepper 値は常に Interface Builder で定義された初期値を示します (1)。

[10682:f803] in viewDidLoad: self.multiplierStepper.value: 1.000000
[10682:f803] in viewDidLoad: randomstring: string set from Scene 1

答えはおそらく明白ですが、表示中のView Controllerから目的のView Controllerにステッパーの値を設定する方法がわかりません。

私が間違っていることはありますか?

4

1 に答える 1

2

prepareForSeque メソッドで UIStepper の値を直接設定しないでください。機能しません。

値を含むプロパティを宣言し、2 番目のコントローラーの viewDidLoad イベントでステッパーの値を設定する必要があります ...

まず、2 番目のビュー コントローラー (ViewController2) ヘッダー ファイルに追加のプロパティを宣言します。

@property (nonatomic) double stepperValue;

次に、プロパティ値を設定します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([[segue identifier] isEqualToString:@"goToView2"]){
        ViewController2 *controller2 = [segue destinationViewController];
        controller2.stepperValue = 7.0;
        controller2.randomString = @"string set from Scene 1";
    }
}

次に、宛先のviewController(ViewController2)で:

- (void)viewDidLoad
{
    multiplierStepper.value = [self stepperValue];
}

ノート

クラスのクライアントが IBOutlet に直接アクセスできないようにするために、IBOutlet をクラスのプライベート メンバーとして宣言するのがカプセル化の最善の方法であることに注意してください。IBOutlet を非公開にするには、.m ファイルのクラス拡張で宣言する必要があります ...

于 2012-07-14T08:30:01.193 に答える