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

Objective c 在不同的视图控制器中更改另一个视图的出口,objective-c,view,uiviewcontroller,ibaction,iboutlet,Objective C,View,Uiviewcontroller,Ibaction,Iboutlet,假设我在view1上有一个标签,它连接到ViewController1.m。我希望能够在名为ViewController2.m的不同视图控制器中更改label.text值 起初,我尝试将标签(已连接到ViewController1.m)连接到ViewController2.m,但它不允许我将其连接为插座,只允许一个操作。可能是因为引用的类是ViewController1直接回答您的问题,假设您是故事板或xib'ing,您只能将插座连接到与该viewController的“自定义类”中定义的类或子

假设我在
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中的值。更新viewController2.textField也不会将该值反映回viewController1.textField。您必须手动执行此操作,因为连接是相对于viewController的单个给定实例的

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

ViewController1->ViewController2 如果是故事板,则需要在PrepareForegue中将值从一个viewController传递到另一个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->ViewController1 如果要将某些内容从viewController2传递回viewController1,则需要创建一个协议,将viewController1设置为viewController2的委托,然后根据需要回调以镜像该值

ViewController1.h:

#import "ViewController2.h"

@interface ViewController1 : UIViewController<ViewController2Delegate>
ViewController2.h:

@protocol ViewController2Delegate<NSObject>
@required
    - (void)importantValueDidChange:(NSString *)value;
@end

@property (weak, nonatomic) id<ViewController2Delegate> delegate;

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

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

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

ViewController1->ViewController2 如果是故事板,则需要在PrepareForegue中将值从一个viewController传递到另一个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->ViewController1 如果要将某些内容从viewController2传递回viewController1,则需要创建一个协议,将viewController1设置为viewController2的委托,然后根据需要回调以镜像该值

ViewController1.h:

#import "ViewController2.h"

@interface ViewController1 : UIViewController<ViewController2Delegate>
ViewController2.h:

@protocol ViewController2Delegate<NSObject>
@required
    - (void)importantValueDidChange:(NSString *)value;
@end

@property (weak, nonatomic) id<ViewController2Delegate> delegate;

控制器在运行时是如何关联的?(例如,ViewController1是否创建ViewController2?)?(例如,ViewController1是否创建了ViewController2?)这是很多信息,我需要一些时间来研究/消化你写的内容。谢谢你!如果有效/在我理解itOk后,将标记为已接受。如果你有任何问题,直接问。我可能不会马上回复,但我会回复的。这是很多信息,我需要一些时间来研究/消化你写的东西。谢谢你!如果有效/在我理解itOk后,将标记为已接受。如果你有任何问题,直接问。我可能不会立即回应,但我会回应。