0

我有一个UITabBarController基于应用程序。我创建了一个masterVC类,所有构成的 ViewControllertabBarController都是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

4 回答 4

1

好吧,创建一个适当的数据源,每个人都UIViewController可以在其中请求数据。有一些方法:

  • 将图像保存到磁盘,使用辅助类来检索它。
  • 将图像保存为 Singleton 的属性并检索它。
于 2012-11-13T22:07:32.737 回答
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;
于 2012-11-13T22:08:35.120 回答
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在任何子类上设置属性时,您的图像视图都会相应地更新其内容。

于 2012-11-13T22:18:13.797 回答
0

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

viewDidAppear如果您没有其他设置要做,请删除该方法,然后它将调用viewDidAppear您的masterVC.

或者

更改为以下内容,viewDidAppear以便它会调用然后执行所有其他设置。viewDidAppearmasterVC

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

    // your other code...
}
于 2012-11-13T22:20:48.247 回答