0

我需要从弹出视图控制器更新主视图控制器上的图像。

该按钮在主视图(EraViewController)上称为“Feature2btn”,但是当我在弹出视图控制器上尝试以下代码时,它不起作用。

它需要立即更新,因为主视图仍在后台显示并且不会重新加载,因此更改需要直接由弹出视图上的操作引起。

- (IBAction)purchase:(id)sender {
 HomeController = [[EraViewController alloc] initWithNibName:@"EraViewController" bundle:nil];
    UIImage *image = [UIImage imageNamed:@"ico_plan.png"];
    [(EraViewController*)HomeController setFeature2Btn:[feature2Btn setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
 }
4

3 回答 3

1

有(至少)两种方法可以做到这一点:

  1. 您使用一个控制器监听而另一个控制器在适当的时间发送的通知。
  2. 您创建一个委托协议,第一个控制器实现,第二个调用。

委托人有点复杂,但通常被认为是好的风格。通知也不错,但“优雅”稍差。我将在此处描述基于通知的通知,因为它似乎适合您的情况,并且还允许通过在多个地方注册通知来对购买做出反应。

在要更新图像的控制器中,在以下位置注册通知viewDidAppear:

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

实现updateImage:方法:

-(void)updateImage:(NSNotification*)note
{
    NSString* newImageName = note.userInfo[@"imageFileKey"];
    // ... update UI with the new image
}

还要确保在视图消失时取消注册该通知:

-(void)viewWillDisappear:(BOOL)animated
{
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     [super viewWillDisappear:animated];
}

在另一个触发更新的控制器中,在适当的位置触发通知:

-(IBAction)purchase:(id)sender
{
    // ...

    NSDictionary* userInfo = @{@"imageFileKey" : newImageName};
    [[NSNotificationCenter defaultCenter]
                postNotificationName:@"UpdateImageNotification"
                              object:self userInfo:userInfo];
    // ...
}

通知上下文中的object参数用于指定是否要通过任何对象或仅通过非常特定的实例来收听通知。在许多情况下,实际实例并不相关,但您只需通过名称来识别通知(如本例中的“UpdateImageNotification”)。

userInfo词典旨在携带您需要随通知提供的任何信息。这就是为什么我介绍了一个与新图像名称相关联的键“imageFileKey”。

于 2013-03-25T11:53:39.087 回答
0

我认为你犯了一个小错误。但在继续之前,我只想确认以下是否是场景。如果我错了,请纠正我 1. 您有 mainViewController/HomeViewController(EraViewController 类型),您想在其中更新图像 2. 在 mainViewController 上,您有一个弹出屏幕,其中编写了上述代码。该代码旨在更改 mainViewController/HomeViewController 上的按钮图像

如果以上是这种情况,那么我建议以下解决方案。

你犯的错误

您正在上面发布的代码中创建 EraViewController 的新对象并更改图像。根据 OOPS 概念,将创建该控制器的新实例(在屏幕上不可见的第二个实例),并且您正在该实例中应用新图像。现在,由于该实例根本不可见,您会感觉到屏幕没有更新。

解决方案

这个问题至少有 3 个解决方案 1. 一个解决方案是 Daniel Schneller 给出的答案(可能稍作修改) 2. 通过代表来实现这一点。- 您必须在 PopViewController 中编写协议,并且必须在 HomeViewController/mainViewController 中实现它。- 随着图像的变化,在 PopViewController 中,必须使用委托和协议方法通知 mainViewController。- 这样 mainViewController 将收到通知并执行协议方法。在该方法中,您应该有一个代码来更新按钮上的图像。3.(不建议这样做,因为这不是一个好的设计)您已经维护了在屏幕上可见的实际 viewController 的实例(在变量中,比如说 homeViewController)。

- (IBAction)purchase:(id)sender {
    UIImage *image = [UIImage imageNamed:@"ico_plan.png"];
    [(EraViewController*)homeViewController setFeature2Btn:[feature2Btn setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
 }

希望这有帮助。

谢谢

于 2013-03-25T12:06:01.930 回答
-1

尝试这个,

 - (IBAction)purchase:(id)sender 
 {
       [[NSNotificationCenter defaultCenter] postNotificationName:@"updateimage"        object:imageName];
  }

在主视图控制器中

-(void)viewDidLoad

{
 [[NSNotificationCenter defaultCenter] removeObserver:self];
 [[NSNotificationCenter defaultCenter] addObserver:self    selector:@selector(updateiimage:) name:@"updateimage" object:nil];

 }

- (void) updateiimage:(NSNotification *)notification
{
  NSString * text =[notification object];
   //update Image
 }
于 2013-03-25T11:40:08.877 回答