我有一个主视图控制器(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];
}
我的问题是,当从创建它的类之外调用该方法时,如何才能更改这些标签?
界面构建器示例屏幕截图: 单击该按钮时,子视图中的标签应该更新。
答案 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比我快。做他说的话。