2014-08-31 80 views
0

嘿,我有两个UIViewControllers。在第一个,有一个UIButton其中包含一个图像。当用户到达我的第二个ViewController时,有许多按钮,其中包含不同的图像。所以,当用户按下我的VC2中的一个按钮时,它应该将自身的图像设置为我VC1上的UIButton。从另一个类访问IBOutlet

我已经加入实现了第一个VC: #import "ViewController1.h"@interface ViewController2()ViewController2.m

我怎么能这样做?例如:

VC2:

- (IBAction)seaButton:(id)sender { 
//Access the IBOutlet from VC1 and set the image of the Button like: 

UIImage * seaBtnImage = [UIImage imageNamed:@"Sea.png"]; 
[buttonOutlet setImage:seaBtnImage forState:UIControlStateNormal]; 
} 

谢谢!

+0

将店铺视为私人店铺。如果视图控制器具有相互传递的信息,则应该使用方法来配置它们,以便可以在另一个方法中调用该方法。 – matt 2014-08-31 17:23:12

回答

2

步骤1:在ViewController2.h VC2上创建一个属性来引用VC1:

#import "ViewController1.h" 

@property (nonatomic, strong) ViewController1 *viewController1; 

步骤2:当您在VC1创建VC2,设置属性:

[viewController2 setViewController1:self]; 

步骤3 :在ViewController2上设置按钮图像

[self.buttonVC2 setImage:[self.viewController1.buttonVC1 imageForState:UIControlStateNormal] forState:UIControlStateNormal]; 

注意:更好的模型是在VC1上提供一种方法,该方法返回正确的图像。例如,在VC1:

- (UIImage *)imageForButton { 
    return [self.buttonVC1 imageForState:UIControlStateNormal]; 
} 

和VC2:

[self.buttonVC2 setImage[self.viewController1 imageForButton]]; 
+0

由于高耦合,实际上很糟糕的做法。更不用说强有力的控制器保留,在某些情况下可能容易导致保留周期 – keeshux 2016-04-05 07:49:54

1

这就是代表们踢定义是这样的:

@protocol ButtonSelectionDelegate <NSObject> 

- (void)didSelectButtonImage:(UIImage *)image; 

@end 

和VC1实现它。将以下属性添加到VC2:

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

并将VC1设置为VC2的委托。

在VC2的IBAction你将通过将本地选择图像调用上述didSelectButtonImage:方法在委托:

- (IBAction)seaButton:(id)sender 
{ 
    UIImage *seaBtnImage = [UIImage imageNamed:@"Sea.png"]; 
    [self.delegate didSelectButtonImage:seaBtnImage]; 
} 

在VC1的didSelectButtonImage:将更新与由委托提供的一个VC2出口按钮图像:

- (void)didSelectButtonImage:(UIImage *)image 
{ 
    [self.buttonOutlet setImage:image forState:UIControlStateNormal]; 
}