Iphone 目标C:从单独的类更改图像

Iphone 目标C:从单独的类更改图像,iphone,ios,objective-c,xcode,Iphone,Ios,Objective C,Xcode,我已经四处寻找答案,但毫无结果,所以我希望我不是在问一个有答案的问题 我有两个类(ClassA和ClassB),它们都连接到通过segue链接的UIViewController。ClassA包含一个名为backgroundImage的UIImage。我的目标是从ClassB中更改ClassA的背景图像 在B.h类中,我尝试过: @property (nonatomic, retain) ClassA *mainView; 在ClassB.m中,我尝试通过以下方式更改背景图像: @synthes

我已经四处寻找答案,但毫无结果,所以我希望我不是在问一个有答案的问题

我有两个类(ClassA和ClassB),它们都连接到通过segue链接的UIViewController。ClassA包含一个名为backgroundImage的UIImage。我的目标是从ClassB中更改ClassA的背景图像

在B.h类中,我尝试过:

@property (nonatomic, retain) ClassA *mainView;
在ClassB.m中,我尝试通过以下方式更改背景图像:

@synthesize mainView;
//Then inside button click I tried:
[mainView.backgroundImage setImage:[UIImage imageNamed:@"newImage.jpg"]];
显然,这不起作用,因为我没有将图像设置为应用程序中使用的同一ClassA。
我知道我错过了一些明显的东西,提前谢谢

使用与ClassA相同的“mainView”实例导航到
ClassA视图控制器

应尝试委托机制。它将允许您从classB调用ClassA中的方法。
在该方法中,将classA的背景图像从classB对委派的调用更改为 1) 使用授权。在加载ClassB时传递委托。 2) 使用NotificationCenter并通过调用B类的通知来更改mainView映像


Harry.

请使用协议机制来满足您的要求

实现如下

在项目的AppDelegate.h文件中

@protocol ImageChangeDelegate <NSObject>
@optional
    -(void)ChangeImage;
@end


@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (nonatomic,strong) id<ImageChangeDelegate> delegateImageChange;
现在在B类的.h文件中

#import "AppDelegate.h"

@interface EventGuestListViewController : UIViewController
{
   AppDelegate* appDelegate;
}
-(void)ChangeBackgroundOfClassA;
- (void)viewDidLoad
{
    [super viewDidLoad];
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
现在在B类的.m文件中

#import "AppDelegate.h"

@interface EventGuestListViewController : UIViewController
{
   AppDelegate* appDelegate;
}
-(void)ChangeBackgroundOfClassA;
- (void)viewDidLoad
{
    [super viewDidLoad];
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
现在正在改变BGs的方法

 -(void)ChangeBackgroundOfClassA
 {
     [appDelegate.delegateImageChange ChangeImage];
 }
现在在类A中实现协议以更改背景

现在在A类的.h文件中

 #import "AppDelegate.h"

 @interface EventGuestListViewController : UIViewController <ImageChangeDelegate>
 {
    IBOutlet UIImageView* imageBGClassA;
    AppDelegate* appDelegate;
 }
- (void)viewDidLoad
{
    [super viewDidLoad];
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.delegateImageChange = self; //Here you need to set the delegate to 'self' to call then Custom Protocol method
}

-(void)ChangeImage
{
     imageBGClassA.image = [UIImage imageNamed:@"newImage.jpg"];
}
在类B中,一旦
-(void)ChangeBackgroundOfClassA
调用在类A上实现的委托方法调用,背景图像将发生明显变化

这是我的工作


它可能会帮助你

您可以使用自定义委托或通知轻松完成此任务。我将使用通知向您解释。设两类——A类和B类

在Class-A中添加如下通知

 [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(changeImage)
                                             name:@"ImageChangeNotification"
                                           object:nil];
同时在A类中创建选择器

 -(void)changeImage
   {
       [yourImageView setImage:[UIImage imageNamed:@"YouImageName.png"]];
   }
剩下的就是在整个项目的任何地方发布此通知。在我们的情况下,让它是B类

  [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageChangeNotification" object:nil];

做一件事,在AppDelegate中获取一个字符串,并从类B中更改该字符串。在类A中使用该imagestring。如果您有任何问题,请告诉我。如果存在有效的mainView实例,则此操作应有效。mainView不是正在分段的实例,否则此代码将有效。您可以委托它。您可以让ClassB在ClassA中调用委托方法。您如何将引用分配给ClassA*mainView?ClassB正在从几个保存的图像文件中进行选择,因此我需要传递一个带有文件位置的字符串,在此代码中ClassB在哪里提供字符串?您可以使用协议方法传递字符串
-(void)ChangeImage
-(无效)ChangeImage:(NSString*)string。然后根据您的要求传递string谢谢,我今晚晚些时候会尝试。如果它有效,我会接受您的最佳答案。谢谢。我最终使用了不同的解决方案,但您的答案描述得非常好,效率也很高。谢谢。我可以得到一个访问ClassA的ViewController的示例吗?我在ClassA中的什么位置调用NSNotificationCenter,ClassB是如何决定新图像应该是什么文件名的?在classA中,NSNotificationCenter应该在ViewDidLoad中调用,您也可以在将ClassB中的NSNotification发布到classA时发布任何对象以及通知。希望您明白我的意思。因此,通过发布任何对象,您可以你有对象:nil,我可以发送一个带有新图像名称的字符串吗?