2014-04-07 25 views
0

我有一个主视图控制器(ViewControllerA),它有一个带有子控件ViewControllerB的容器,里面有几个标签和按钮。在应用程序的使用过程中,NSUserDefaults将会更改,并且ViewControllerB中的标签需要更新(简化版本)。在外部调用的方法中使用“self”

我在ViewControllerB的类文件里面有一个方法,我可以从ViewControllerA访问,但是调用该方法并没有更新我怀疑是由于self引用引起的标签。该方法肯定大火和我已经包括ViewControllerB的在ViewControllerA等头类

- (void)testingMethod{   
    if(![[NSUserDefaults standardUserDefaults] stringForKey:@"firstValue"]){ 
     [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"firstValue"]; 
     [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"secondValue"]; 
     [[NSUserDefaults standardUserDefaults] setObject:@"Never" forKey:@"thirdValue"]; 
    } 
    self.firstLabel.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"firstValue"]; 
    self.secondLabel.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"secondValue"]; 
    self.thirdLabel.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"thirdValue"]; 
} 

的方法是从IBAction ViewControllerA的类中调用从像这样:

- (IBAction)doThis:(id)sender{ 
    ViewControllerB * something; 
    something = [[ViewControllerB alloc] init]; 
    [something testingMethod]; 
} 

我的问题则是如何在从创建类的外部调用该方法时如何获取这些标签?

接口生成器示例屏幕截图: enter image description here 单击按钮时,子视图中的标签应该更新。

+0

您是否在与显示的实例相同的实例上调用此方法?你能说出你称之为这种方法的部分吗? – streem

+0

我编辑了我的问题以显示来自ViewControllerA的.m文件的调用方法。这应该有希望给你一些见解。 – ScottMcGready

+0

啊!你如何从A移到B?你在用Segue吗?你可以展示你如何从A到B的代码。 – Fogmeister

回答

1

您不会在与显示的实例相同的实例上调用testingMethod。你需要有伊娃在你的ViewController声明的,那么你就会有这样的事情

在ViewController中阿

@class ViewControllerB; 

@interface ViewControllerA : UIViewController 
{ 
    ViewControllerB *viewControllerB; 
} 

在视图控制器上午

//Add this method to get the viewControllerB instance 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    //This identifier is set in the storyboard, in the attribute inspector of the segue 
    if([[segue identifier] isEqualToString:@"segueVCB"]) 
    { 
     viewControllerB = [segue destinationViewController]; 
    } 
} 

- (IBAction)doThis:(id)sender{ 
    [viewControllerB testingMethod]; 
} 

基本上,想象你的viewControllerA是你的汽车和viewControllerB是你的头灯。你想通过点击一个按钮打开前大灯。您将大灯正确添加到您的汽车中,但是当您单击该按钮时,您将创建另一个永远不会添加的大灯,并且您希望汽车上的大灯亮起。这没有任何意义。你需要有一双大灯,并在点击按钮时激活它们。

+0

这似乎导致不幸的一个错误:'接收器类型'ViewControllerB'例如消息是一个前向声明' 任何想法? – ScottMcGready

+0

你导入了ViewControllerB.h吗? – streem

+0

的确有一些其他古怪的东西肯定没有意义。给我一点时间,我会给Xcode一个好时光,然后再打开它。 – ScottMcGready

0

您可以尝试使用objectForKey而不是。

我不认为(不是100%),他们是可以互换的方式使用它们。

编辑

OK,你所访问ViewControllerB的方式是不正确的。您正在创建一个全新的实例。

您可能将ViewControllerB作为子视图/子视图控制器,但这不是您在其上运行的方法。

您需要获取子视图控制器并在其上运行该方法。 @Justafinger比我快。做他的话。

+0

甚至尝试像'self.firstLabel.text = @“hardcodedString”;'不会飞。 'stringForKey'我会更新,但不能相信我错过了! – ScottMcGready