我想从ViewController1编辑ViewContrller2中的UILabel。
这是我的代码,但它不起作用:
视图控制器1.m:
// ....
// In my viewDidLoad :
ViewController2 *vc = [[ViewController2 alloc]init];
// calling a function :
[vc updateLabel];
// ....
视图控制器2.m:
// ....
-(void)updateLabel{
self.MyLabel.text = @"Text";
// MyLabel is already declared in ViewController2.h
}
// ....
你能帮我吗?
我已经尝试了很多代码,但它仍然不起作用,我不知道问题出在哪里。
错,为了实现这一目标,我可能会使用 NSUserDefaults 在视图控制器之间拉取信息。
视图控制器1
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
[standardDefaults setObject:@"This is my Label" forKey:@"labelKey"];
视图控制器2
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
MyLabel.text = [standardDefaults stringForKey:@"labelKey"]
答案已更新,以反映UIProgressView的修改问题,如下评论:
视图控制器1.m
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
[standardDefaults setDouble:0.75 forKey:@"ProgressValue"]; //value you want your progress view to show
视图控制器2.h
。在此处为您的进度视图创建一个出口,并将其链接到IB
@property (weak, nonatomic) IBOutlet UIProgressView *ProgressView;
视图控制器2.m
@synthesize ProgressView;
。
NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
double ProgressValue = [standardDefaults doubleForKey:@"ProgressValue"];
ProgressView.progress = ProgressValue;
您正在创建 ViewController2 类的新对象,如果要将此值设置为所有视图,则可以使用:-1-NSUserDefaults2-SQLite3 核数据查看如何在视图控制器之间传递数据:-在视图控制器之间传递数据
您正在创建新版本的 vc2,您需要访问已经存在的版本。 尝试改为共享对 vc1 中 vc2 控制器的引用
您还需要考虑是否应该直接从 vc1 更新它 - 您可以在 vc2 中刷新 viewDidLoad 上的标签
根据您创建vc1和vc2的方式,有许多选项,这里有很好的优缺点描述 http://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/
确保在调用updateLabel
之前ViewController2
调用ViewController2
的viewDidLoad
方法,否则self.MyLabel
将为 nil,因此您分配给self.MyLabel.text
的任何内容都将毫无用处。现在,为了确保调用ViewController2
的viewDidLoad
,您需要访问ViewController2
的视图属性,因为第一次尝试访问控制器的视图时会调用视图控制器的viewDidLoad
。
一旦viewDidLoad
你打算做的事情肯定会奏效。若要确认这确实是问题所在,请在 -(void)updateLabel
方法中保留一个断点并进行分析以查看self.MyLabel
是否为 nil。