我有两个视图控制器,一个是MainViewController,另一个是SetupViewController。我希望MainViewController上的UILabel在SetupViewController中按下按钮时将文本设置为来自SetupViewController的UITextField的内容。
在SetupViewController中,我在IBAction中有这个:
- (IBAction)donePressed:(id)sender {
MainViewController *mvc = [[MainViewController alloc] init];
[mvc.testLabelOnMVC setText:testTextFieldOnSVC.text];
[release mvc];
}
testLabelOnMVC(和testTextFieldOnSCV,各自的条款)是
@property (nonatomic, retain) UILabel *testLabelOnMVC;
并且也是合成的。
每次尝试,都不起作用。什么都没发生,没有任何改变。我没有错误或警告。任何人都可以帮助我吗?
答案 0 :(得分:1)
在引用MainViewController的视图属性(强制viewDidLoad执行)之前,MainViewController的视图不存在。在尝试修改MainViewController中的任何UI对象之前,必须引用该视图(或以其他方式强制构建视图)。
答案 1 :(得分:0)
当您按下按钮时,您正在分配新的MainViewController,然后您在此新控制器上设置标签的文本,而不是在您的应用正在显示的MainViewController上。
要解决此问题,请创建指向原始MainViewController的IBOutlet或iVar,并在其上设置文本。
答案 2 :(得分:0)
最简单的方法是在主视图控制器中创建一个@property并在其中写入文本。然后在第二个MVC的viewDidLoad中读取它。
答案 3 :(得分:0)
MainViewController应该担心的唯一视图是它拥有的视图;它不应该尝试访问由SetupViewController管理的视图层次结构。同样,SetupViewController不应直接修改MainViewController视图中的视图。
正确的做法是让两个控制器直接或通过数据模型相互通信。例如,假设您的MainViewController实例化SetupViewController。如果是这种情况,mvc
将自己设置为svc
的委托是很自然的,这样svc
就会向-setupController:didUpdateTestStringTo:
发送消息testLabel
。然后,MainViewController对该方法的实现可以在某处保存新的测试字符串并更新它的{{1}}字段。
另一个例子:MainViewController实例化SetupViewController。 SetupViewController包含一个字段,用户可以在该字段中输入测试字符串的新值。在退出之前,SetupViewController将该字段的内容写入NSUserDefaults或其他一些常见数据存储。当控件返回MainViewController时,该对象将读取共享数据并根据需要自行更新,包括为testLabel设置新值。
同一主题还有其他变体,但这里的共同点是视图控制器都不能直接访问它不拥有的视图。
答案 4 :(得分:0)
如果视图已加载,您可以更改标签的文本。如果您使用导航控制器,而不是初始化viewcontroller,请从视图堆栈中检索它。 我不知道你的viewController是否已经加载。