如何从不同的UIViewController访问值

时间:2013-05-27 17:35:10

标签: iphone ios objective-c uiviewcontroller

如何从位于第二个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

4 个答案:

答案 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 filesstoryboards可以帮助您解决问题。试试这些教程。

答案 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:或使用上述指定的初始化。