0

如何从位于第二个 viewController 中的 inputField 访问值?

第二个视图控制器的类名是SettingsViewController, inputField 的出口名是setRateInput

我试过这个,但它没有工作......

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

当我 NSLog 它出来的值是:(空)

知道我做错了什么吗?

这是主视图控制器的实现文件:

#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

你实例化了一个 new SettingsViewController,但你没有做任何事情来实例化它的 textfield setRateInput。实例化它时可以这样做:

_settings = [[SettingsViewController alloc]init];
_settings.setRateInput = [UITextField alloc] initWithFrame:someFrame]];

或者,作为一个更好的解决方案,将文本字段实例-init化为SettingsViewController

- init {
  if (self = [super init] {
    self.setRateInput = [UITextField alloc] initWithFrame:someFrame]];
  }
  return self;
}

如果您使用 nib 文件,这会容易得多。

注意: setRateInput是属性的坏名称。rateTextField改为考虑。

编辑我忘了添加您必须将文本字段作为子视图添加到其父视图。

所以它会像,

_settings = [[SettingsViewController alloc]init];
_settings.setRateInput = [[UITextField alloc] initWithFrame:someFrame] autorelease];
[_settings.view addSubView:_settings.setRateInput];

In this case, the setRateInput is retained by its super view. You're not using ARC, so you can call autorelease on your text field.

The better solution: Use - (void) loadView; inside SettingsViewController. Loading the view is the responsibility of the correspondent view controller.

- (void) loadView {
    self.setRateInput = [[UITextField alloc] initWithFrame:someFrame] autorelease];
    [self.view addSubView:_settings.setRateInput];
}

Edit: xib files and storyboards can help you out. Give these tutorials a try.

于 2013-05-27T17:49:58.840 回答
1

In theory, you could create a global. Create a new class, call it something like taxRate (.h and .m)

In taxRate.h, add the following code:

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

@interface TaxRate : NSObject {


}

@property (nonatomic, retain) double * taxRateFromInput;

+(TaxRate*)getInstance;

@end

Then, in your controller, put a "#import taxRate.h" in there. In your .m file, add the following:

#import "TaxRate.h"

@implementation TaxRate


@synthesize taxRateFromInput;

static TaxRate *instance =nil;  

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


@end

Note: This is extremely similar in structure to what I'm purposing.

于 2013-05-27T17:53:00.180 回答
1

if you have the reference from the object view controller you can just access by the property from your attribute.

于 2013-05-27T19:03:55.097 回答
0

你走在正确的轨道上,你的懒惰实例化也做得很好(我的意思是你掌握了这个概念)。

但请注意,在调用 viewDidLoad 之前,插座不会连接。因此,如果您只是分配/初始化您的 viewController(懒惰地),那么您的文本字段的出口指向 nil。在访问控制器的视图属性(即显示视图)之前,插座不会连接。

您可以做的是为设置 viewController 提供计算 viewController 的句柄,并让它在计算 viewController 上设置一个表示速率的公共属性。这是一种常见的模式 - 委托 - 其中一个 viewController (settingsViewcontroller) 在其委托上调用一个方法(计算 viewController)。

然后,您不需要计算 viewController 中的 settingsViewcontroller 属性,而只需在每次您希望它被启动时实例化一个新的设置 viewController,并为其提供对计算 viewController 的引用。

另一种可能性——也许更好——是定义一个模型对象来进行计算并处理它需要计算的速率。然后你可以给你的 settingsViewcontroller 一个对该模型对象的引用(可能在你的另一个 viewController 中实例化),这样它就可以改变它的速率。

PS:还要重新考虑您通常如何实例化视图控制器。指定的初始化程序是-initWithNibName:bundle:- 所以通常,你不会只是分配/-init它们。如果您使用故事板(您可能应该!),使用故事板-instantiateViewControllerWithIdentifier:或使用上面提到的指定初始化程序。

于 2013-05-27T17:47:36.757 回答