从辅助视图控制器更新映像

时间:2013-03-25 11:31:11

标签: ios objective-c xcode uibutton

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

按钮在主视图(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];
 }

3 个答案:

答案 0 :(得分:1)

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

  1. 您使用一个控制器侦听的通知,另一个控制器在适当的时间发送。
  2. 您可以创建第一个控制器实现的委托协议,第二个是调用。
  3. 代表人员有点复杂但通常被认为是好的风格。通知也不错,但稍微不那么“优雅”。 我将在此处描述基于通知的通知,因为它似乎适用于您的情况,并且还允许通过在那里注册通知来对多个地方的购买做出反应。

    在包含要更新图像的控制器中,在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”。

答案 1 :(得分: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)。然后你可以在popupViewController

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

这会有所帮助。

由于

答案 2 :(得分:-1)

试试这个,

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

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