在不同的视图控制器中更改另一个视图的出口



假设我在view1上有一个连接到ViewController1.m的标签。我希望能够在一个名为ViewController2.m的不同视图控制器中更改label.text的值。

起初,我尝试将标签(已连接到ViewController1.m)连接到ViewController2.m,但它不允许我将其作为出口连接,只能作为一个操作。可能是因为引用的类是ViewController1

要直接回答您的问题,假设您是故事板或xib'ing,您只能将出口连接到与该viewController的"自定义类"中定义的类或子类相同的viewController。

但是,这一点非常重要,不要把连接和实例化混为一谈。假设您确实连接了viewController1.textField和viewController2.textField,这并不意味着当viewController2出现时,viewController2-textField中会神奇地包含来自viewController1-textField的值。更新viewController2textField也不会将该值反映回viewController1TextField。您必须手动执行此操作,因为这些连接是相对于viewController的单个给定实例的。

假设ViewController1首先显示,两个方向的通信如下:

ViewController1->ViewController2

如果你是故事板,你需要在prepareForSegue中将值从一个viewController传递到另一个,例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// NOTE: if your viewController is laid out with multiple segues,
// use [segue identifier] to discern which segue has been triggered
ViewController2 *vc = (ViewController2 *)[segue destinationViewController];
vc.textField = self.textField;
}

如果您正在实例化而不是故事板(警告:此代码尚未测试):

ViewController2 *vc = [[ViewController2 alloc] init];
vc.textField = self.textField;
[self presentViewController: vc animated: YES];

ViewController2->ViewController1

如果您想将某些内容从viewController2传递回viewController1,那么您需要创建一个协议,将viewController1设置为viewController2中的委托,然后根据需要回调以镜像该值。

ViewController1.h:

#import "ViewController2.h"
@interface ViewController1 : UIViewController<ViewController2Delegate>

ViewController1.m:

vc.delegate = self; // vc = pointer to viewController2

ViewController2.h:

@protocol ViewController2Delegate<NSObject>
@required
- (void)importantValueDidChange:(NSString *)value;
@end
@property (weak, nonatomic) id<ViewController2Delegate> delegate;

ViewController2.m:(当值需要更新时)

if([self.delegate respondsToSelector: @selector(@ importantValueDidChange:)]) {
[self.delegate importantValueDidChange: self.textField.text];
}

最新更新