0

2 番目の viewController にある inputField から値にアクセスするにはどうすればよいですか?

2 番目のビュー コントローラーのクラス名はSettingsViewControllerで、inputField のアウトレット名はsetRateInputです。

これを試してみましたが、うまくいきませんでした…

double taxRateFromInput = [[self.settings.setRateInput text]doubleValue];

I NSLogの場合、値は次のようになります: (null)

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

メインのviewControllerの実装ファイルは次のとおりです。

#import "SettingsViewController.h"

@interface ViewController ()

@property (strong, nonatomic) SettingsViewController * settings;

@end

@implementation ViewController

// lazy instantiation 
-( SettingsViewController *) settings
{
    if (_settings == nil) {
        _settings = [[SettingsViewController alloc]init];
    }
    return _settings;
}


- (IBAction)calculatePrice:(id)sender {


    double taxRateFromInput = [[self.settings.setRateInput text]doubleValue];

@end
4

4 に答える 4

1

理論的には、グローバルを作成できます。新しいクラスを作成し、taxRate (.h および .m) のような名前を付けます。

taxRate.h に、次のコードを追加します。

#import <Foundation/Foundation.h>
@class MyTaxRate;

@interface TaxRate : NSObject {


}

@property (nonatomic, retain) double * taxRateFromInput;

+(TaxRate*)getInstance;

@end

次に、コントローラーに「#import taxRate.h」を入れます。.m ファイルに、次を追加します。

#import "TaxRate.h"

@implementation TaxRate


@synthesize taxRateFromInput;

static TaxRate *instance =nil;  

+(TaxRate *)getInstance
{
    @synchronized(self)
    {
        if(instance==nil)
        {         
            instance= [TaxRate new];
        }
    }
    return instance;
}


@end

注: これは、私が意図しているものと構造が非常に似ています。

于 2013-05-27T17:53:00.180 に答える
0

あなたは正しい軌道に乗っており、怠惰なインスタンス化もうまくいっています (概念を理解したというデモンストレーションとして)。

ただし、viewDidLoad が呼び出されるまでアウトレットは接続されないことに注意してください。したがって、viewController を (遅延して) 割り当て/初期化すると、テキスト フィールドへのアウトレットは nil を指します。コントローラーのビュー プロパティにアクセスするまで、つまりビューが表示されるまで、アウトレットは接続されません。

あなたができることは、設定viewControllerに計算中のviewControllerへのハンドルを与え、計算中のviewControllerにレートを表すパブリックプロパティを設定させることです。これは、1 つの viewController (settingsViewcontroller) がそのデリゲートでメソッドを呼び出す (viewController を計算する) という一般的なパターン (委任) です。

その場合、計算ビューコントローラーに settingsViewcontroller プロパティは必要ありませんが、新しい設定ビューコントローラーを起動するたびにインスタンス化し、計算ビューコントローラーへの参照を与えるだけです。

もう 1 つの可能性 (おそらくもっと良い方法) は、計算を行い、計算に必要なレートを処理するモデル オブジェクトを定義することです。次に、settingsViewcontrollerにそのモデルオブジェクトへの参照を与えることができます(おそらく他のviewControllerでインスタンス化されます)。これにより、そのレートを変更できます。

PS: また、viewController を一般的にインスタンス化する方法も考え直してください。指定されたイニシャライザは-initWithNibName:bundle:- したがって、通常は alloc/ それらだけではありません-init。ストーリーボードを使用する場合 (おそらくそうすべきです!)、ストーリーボードを-instantiateViewControllerWithIdentifier:使用するか、上記の指定された初期化子を使用してください。

于 2013-05-27T17:47:36.757 に答える