使用" self"在外部称为方法

时间:2014-04-07 09:03:48

标签: ios objective-c

我有一个主视图控制器(ViewControllerA),它有一个带有子视图控制器(ViewControllerB)的容器,里面有几个标签和按钮。在应用程序的使用过程中,NSUserDefaults将发生变化,ViewControllerB中的标签需要更新(简化版)。

我在ViewControllerB的类文件中有一个方法,我可以从ViewControllerA访问该方法但是调用该方法不会更新我怀疑是由self引用引起的标签。该方法肯定会触发,我在ViewControllerA的标题中包含了ViewControllerB的类。

- (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"];
}

该方法是从ViewControllerA的类中的IBAction调用的,如下所示:

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

我的问题是,当从创建它的类之外调用该方法时,如何才能更改这些标签?

界面构建器示例屏幕截图: enter image description here 单击该按钮时,子视图中的标签应该更新。

2 个答案:

答案 0 :(得分:1)

您不会在与显示的实例相同的实例上调用testingMethod。您需要在ViewController A中声明一个ivar,然后你会有类似这样的东西

在ViewController A.h

@class ViewControllerB;

@interface ViewControllerA : UIViewController
{
    ViewControllerB *viewControllerB;
}

在ViewController A.m

//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是你的头灯。您想通过单击按钮打开前灯。您正确地将车头灯添加到您的车中,但是当您单击按钮时,您会创建另一个从未添加的车灯,并且您希望车上的车灯亮起。这没有任何意义。你需要有一对前大灯,并在你点击按钮时激活它们。

答案 1 :(得分:0)

您可以尝试使用objectForKey代替stringForKey

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

修改

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

您可能将ViewControllerB作为子视图/子视图控制器,但这并不是您正在运行该方法的内容。

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