【问题标题】:Objective-C: Change an image from a separate classObjective-C:从单独的类中更改图像
【发布时间】:2013-04-19 05:37:43
【问题描述】:

我四处寻找这个问题的答案,但无济于事,所以我希望我不是在问一个已回答的问题。

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

在 ClassB.h 中我尝试过:

@property (nonatomic, retain) ClassA *mainView;

在 ClassB.m 中,我尝试通过以下方式更改背景图片:

@synthesize mainView;
//Then inside button click I tried:
[mainView.backgroundImage setImage:[UIImage imageNamed:@"newImage.jpg"]];

显然这不起作用,因为我没有将图像设置为应用程序中使用的同一个 ClassA。 我知道我遗漏了一些明显的东西,在此先感谢!

【问题讨论】:

  • 做一件事,在 AppDelegate 中取一个字符串并从 B 类更改该字符串。在 A 类中使用该图像字符串。如果您有任何问题,请告诉我
  • 如果有一个有效的 mainView 实例,这应该可以工作。
  • mainView 不是被 segued 的实例,否则此代码将起作用。
  • 你可以委托它。您可以让 ClassB 调用 ClassA 中的委托方法。
  • 您如何分配对 ClassA *mainView 的引用?

标签: iphone ios objective-c xcode


【解决方案1】:

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

实现如下

在项目的AppDelegate.h文件中

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


@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (nonatomic,strong) id<ImageChangeDelegate> delegateImageChange;

在项目的AppDelegate.m文件中

@synthesize delegateImageChange;

现在在 B 类的 .h 文件中

#import "AppDelegate.h"

@interface EventGuestListViewController : UIViewController
{
   AppDelegate* appDelegate;
}
-(void)ChangeBackgroundOfClassA;

现在在 B 类的 .m 文件中

- (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;
 }

现在在 A 类的 .m 文件中

- (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"];
}

在 Class B 中,一旦 -(void)ChangeBackgroundOfClassA 调用在 Class A 上实现的委托方法调用,背景图像就会发生变化

这是我的工作

也许对你有帮助!!!

【讨论】:

  • ClassB 正在从几个保存的图像文件中进行选择,所以我需要传递一个带有文件位置的字符串,在这段代码中 ClassB 提供了一个字符串吗?
  • 您可以使用协议方法-(void)ChangeImage-(void)ChangeImage:(NSString *)string 传递字符串。并根据您的要求传递字符串
  • 谢谢,今晚晚些时候我会试试这个。如果它有效,我会接受你的答案是最好的。干杯
  • 我最终使用了不同的解决方案,但您的回答描述得非常好且高效。谢谢
【解决方案2】:

使用 ClassA 的相同“mainView”实例导航到 ClassA View Controller

【讨论】:

  • 我可以举一个访问 ClassA 的 ViewController 的例子吗?
【解决方案3】:

应该尝试委托机制。它将允许您从classB调用classA中的方法。 在该方法中,将 classA 的背景图像从 classB 的调用更改为委托

【讨论】:

    【解决方案4】:

    您可以尝试以下两种方法中的任何一种: 1)使用委托。在加载 ClassB 时传递委托。 2) 使用 NotificationCenter 并通过调用 B 类的通知来更改主视图图像。

    哈利。

    【讨论】:

      【解决方案5】:

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

      在 Class-A 中添加这样的通知

       [[NSNotificationCenter defaultCenter] addObserver:self
                                               selector:@selector(changeImage)
                                                   name:@"ImageChangeNotification"
                                                 object:nil];
      

      同样在 Class-A 中创建选择器

       -(void)changeImage
         {
             [yourImageView setImage:[UIImage imageNamed:@"YouImageName.png"]];
         }
      

      剩下的就是在整个项目的任何地方发布这个通知。在我们的例子中,让它成为 B 类

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

      【讨论】:

      • 我在 ClassA 的什么地方调用 NSNotificationCenter,ClassB 如何决定新图像应该是什么文件名?
      • 在 classA 中 NSNotificationCenter 应该在 ViewDidLoad 中调用,您也可以在将 classB 中的 NSNotification 发布到 ClassA 时将任何对象与 Notification 一起发布。希望你明白我的意思。
      • 所以通过发布任何有 object:nil 的对象,我可以发送一个带有新图像名称的字符串?
      猜你喜欢
      • 1970-01-01
      • 2014-03-24
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多