在TabBar中的视图控制器之间共享UIImageView

时间:2012-11-13 22:01:54

标签: iphone ios uiviewcontroller uiimageview uitabbarcontroller

我有一个基于UITabBarController的应用。我创建了一个masterVC类,构成tabBarController的所有ViewControllers都是masterVC的子类。我想设置一个UIImageView(这是masterVC的一个属性),一旦设置在tabBarController内的每个视图上显示该图像。

如果我实例化每个VC,我可以将图像作为属性传递(这很简单)。但是,在tabBarController ViewControllers之间没有方法可以做到这一点。

我正在尝试做的最简单的概念示例是在tabBarController中的每个视图中的这个示例。必须有更好的方法:

-(void)viewDidAppear:(BOOL)animated
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:kMainImageData];
    if (data) {
        self.mainImageView.image = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
}

-(void)viewWillDisappear:(BOOL)animated
{
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.mainImageView.image];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMainImageData];
}

4 个答案:

答案 0 :(得分:1)

有,创建一个合适的数据源,每个UIViewController可以请求数据。有一些方法:

  • 将图像保存到磁盘,使用帮助程序类进行检索。
  • 将图像保存为Singleton的属性并检索它。

答案 1 :(得分:1)

您可以重载方法

-(id) initWithCoder:(NSCoder*)aDecoder

有这样的事情:

self = [super initWithCoder:aDecoder];
if ( self )
{
    static UIImage *reuseImage = nil;

    if ( reuseImage == nil )
    {
        //Init reuseImage with your image
    }

    myImageViewProperty.image = reuseImage;
...
return self;

答案 2 :(得分:1)

如果我理解正确,我认为你可以通过键值观察在你的超类中完成所有这些。

masterVC标题中,声明:

@property (strong) UIImage *sharedImage;

在实施中:

@synthesize sharedImage;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self addObserver:self forKeyPath:@"sharedImage" options:NSKeyValueObservingOptionNew context:NULL];
    }
    return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"sharedImage"]) {
        self.mainImageView.image = self.sharedImage;
    }
}

- (void)dealloc {
    [self removeObserver:self forKeyPath:@"sharedImage"];
}

然后,只要在任何子类上设置sharedImage属性,您的图像视图就会相应地更新其内容。

答案 3 :(得分:0)

我认为最简单的方法是将您发布的viewDidAppear方法移到masterVC课程中。然后在子类masterVC的ViewControllers中,您可以:

如果您没有其他设置可以删除viewDidAppear方法,则会调用viewDidAppear中的masterVC

OR

viewDidAppear更改为以下内容,以便在viewDidAppear中致电masterVC,然后执行所有其他设置。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    // your other code...
}