如何从位于第二个viewController中的inputField访问该值?
第二个视图控制器的类名是 SettingsViewController ,inputField的出口名是 setRateInput 。
我尝试了这个,但它没有用......
double taxRateFromInput = [[self.settings.setRateInput text]doubleValue];
当我在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
答案 0 :(得分:1)
您实例化了一个新的SettingsViewController
,但您没有做任何事情来实例化其文本字段setRateInput
。您可以在实例化时执行此操作:
_settings = [[SettingsViewController alloc]init];
_settings.setRateInput = [UITextField alloc] initWithFrame:someFrame]];
或作为beter解决方案,在-init
的{{1}}中实例化文本字段
SettingsViewController
如果您使用nib文件,这将更容易。
注意: - init {
if (self = [super init] {
self.setRateInput = [UITextField alloc] initWithFrame:someFrame]];
}
return self;
}
是一个属性错误的名称。请考虑使用setRateInput
。
修改我忘了添加您必须将文本字段作为子视图添加到其父视图。
所以它会像,
rateTextField
在这种情况下,_settings = [[SettingsViewController alloc]init];
_settings.setRateInput = [[UITextField alloc] initWithFrame:someFrame] autorelease];
[_settings.view addSubView:_settings.setRateInput];
由其超级视图保留。您没有使用ARC,因此您可以在文本字段中调用setRateInput
。
更好的解决方案:在autorelease
内使用- (void) loadView;
。加载视图是对应的视图控制器的责任。
SettingsViewController
修改: xib files和storyboards可以帮助您解决问题。试试这些教程。
答案 1 :(得分: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
注意:这是extremely similar结构与我的目的。
答案 2 :(得分:1)
如果您拥有来自对象视图控制器的引用,则只能通过属性访问该属性。
答案 3 :(得分:0)
你走在正确的轨道上,你的懒惰实例也做得很好(如 你抓住这个概念的演示,我的意思是。
但请注意,在调用viewDidLoad之前,这些出口不会连接。所以,如果你 只是分配/初始化你的viewController(懒惰),文本字段的出口指向nil。 在访问控制器的视图属性之前,插座不会连接,即显示视图。
你可以做的是给viewController设置一个处理你的计算viewController的句柄,让它在计算viewController上设置一个表示比率的公共属性。 这是一个常见的模式 - 委托 - 其中一个viewController(settingsViewcontroller)在其委托上调用一个方法(计算viewController)。
在计算viewController中你不需要settingsViewcontroller属性,但是每次你想要它时,只需要实例化一个新的设置viewController,给它一个你的计算viewController的引用。
另一种可能性 - 甚至可能更好 - 是定义一个模型对象,它进行计算并处理它需要计算的速率。然后你可以给你的settingsViewcontroller一个对该模型对象的引用(可能在你的实例中实例化) 其他viewController),以便它可以改变它的速率。
PS:还要考虑一般如何实例化viewControllers。指定的初始化程序为-initWithNibName:bundle:
- 通常情况下,您不仅要分配/ -init
它们。
如果您使用故事板(您可能应该!),请使用故事板-instantiateViewControllerWithIdentifier:
或使用上述指定的初始化。