在不同的视图控制器中更改另一个视图的出口
Changing outlet of another View in a different View Controller
假设我在 view1
上有一个连接到 ViewController1.m
的标签。我希望能够在名为 ViewController2.m
的不同视图控制器中更改 label.text
值。
起初我尝试将标签(已连接到 ViewController1.m
)连接到 ViewController2.m
,但它不允许我将其连接为插座,只能进行操作。可能是因为引用的 class 是 ViewController1
.
要直接回答您的问题,假设您正在编写故事板或 xib'ing,您只能将插座连接到与 class 相同的 viewController 或子 class 在 "Custom Class" 中为 viewController.
定义
但是,这非常重要,请不要将连接与实例化混淆。假设您确实连接了 viewController1.textField 和 viewController2.textField,这并不意味着当 viewController2 出现时 viewController2.textField 将神奇地拥有来自 viewController1.textField 的值.更新 viewController2.textField 也不会将该值反映回 viewController1.textField。您必须手动执行此操作,因为连接是相对于 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 设置为 viewController 的委托2、然后根据需要回调镜像值。
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];
}
假设我在 view1
上有一个连接到 ViewController1.m
的标签。我希望能够在名为 ViewController2.m
的不同视图控制器中更改 label.text
值。
起初我尝试将标签(已连接到 ViewController1.m
)连接到 ViewController2.m
,但它不允许我将其连接为插座,只能进行操作。可能是因为引用的 class 是 ViewController1
.
要直接回答您的问题,假设您正在编写故事板或 xib'ing,您只能将插座连接到与 class 相同的 viewController 或子 class 在 "Custom Class" 中为 viewController.
定义但是,这非常重要,请不要将连接与实例化混淆。假设您确实连接了 viewController1.textField 和 viewController2.textField,这并不意味着当 viewController2 出现时 viewController2.textField 将神奇地拥有来自 viewController1.textField 的值.更新 viewController2.textField 也不会将该值反映回 viewController1.textField。您必须手动执行此操作,因为连接是相对于 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 设置为 viewController 的委托2、然后根据需要回调镜像值。
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];
}