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

Posted

技术标签:

【中文标题】在不同的视图控制器中更改另一个视图的出口【英文标题】:Changing outlet of another View in a different View Controller 【发布时间】:2017-10-23 19:38:20 【问题描述】:

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

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

【问题讨论】:

控制器在运行时是如何关联的? (例如,ViewController1 是否创建 ViewController2?) 【参考方案1】:

要直接回答您的问题,假设您正在编写故事板或 xib'ing,您只能将插座连接到与该视图控制器的“自定义类”中定义的相同类或子类的视图控制器。

但是,这非常重要,不要将连接与实例化混淆。假设您实际上确实连接了 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 设置为 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];

【讨论】:

信息量很大,需要一些时间来研究/消化你写的东西。不过谢谢!如果它有效/在我理解它之后将标记为已接受 好的。如果您有任何问题,请离开。我可能不会立即回复,但我会回复。

以上是关于在不同的视图控制器中更改另一个视图的出口的主要内容,如果未能解决你的问题,请参考以下文章

从其他视图控制器更改 UIView(笔尖内)背景

如何在单击按钮时在一个视图控制器中正确启用和禁用约束

如何在不同的视图控制器中创建插座?

有没有办法可以在 Swift 中使用 Core Bluetooth 更改另一部 iPhone 上的视图控制器?

根据尺寸等级更改视图属性

Xib 文件 UITableViewCell 出口为零