如何跨多个视图控制器处理常见的xib或控件?

时间:2011-04-11 03:38:23

标签: iphone cocoa-touch ios uiviewcontroller xib

我有一个动画角色与xib中的其他传统控件共存。 一切顺利。没问题。动画是通过UIImageView图像翻转完成的。由计时器触发的动画引擎(状态机)运行该节目。角色使用六个UIImageViews来渲染需要动画的角色的不同部分。

现在我通过添加更多的UIViewControllers(和他们的xib)来看看应用程序变得更复杂的可能性。正如你可能已经猜到的那样,我的角色必须存在于前一个滑动的任何xib上。

实施此方法的最佳方法是什么?我想我可以复制粘贴UIImageView并实例化一个新的动画引擎(或传递指针)到每个新的xib。

我需要的很多方法是新的xib只覆盖先前xib的2/3而且会这样做,但我不确定这是否有效。不确定事件以及它们如何使用两个重叠的xib(如果可能的话)。

在我进行实验的过程中,我想我会问,看看之前来过这里的人是否有一两个有趣的方法可以分享。

2 个答案:

答案 0 :(得分:2)

你的问题似乎是关于所有权而不是关于动画。尝试将字符隔离到自己的xib中(例如 Character.xib )并创建 CharacterLoader 类。 CharacterLoader 类的属性为 character ,如下所示:

<强> CharacterLoader.h

@interface CharacterLoader : NSObject {
}

@property(nonatomic, retain) IBOutlet Character *character;

+ (Character *)loadCharacter;

@end

<强> CharacterLoader.m

...

+ (Character *)loadCharacter {
    CharacterLoader *loader = [[CharacterLoader alloc] init];
    [[NSBundle mainBundle] loadNibNamed:@"Character" owner:loader options:nil];
    Character *character = [loader.character autorelease];
    [loader release];
    return character;
 }

 ...

如果你发现自己制作了很多这些加载器类,你可以将它们转换成一个类,它的作用是基本上像这样以编程方式加载nib。另一种选择是以编程方式创建 Character 和所有其他共享内容,但这可能不适合您,因为您有意通过使用nib来接近它。

答案 1 :(得分:1)

为了关闭循环,这就是我最终做的事情:

我用nib文件创建了一个UIViewController子类。称之为“AnimatedCharacter”。

“AnimatedCharacter.xib”由创建角色所需的所有元素组成。它有一系列控件连接到IBOutlets和由“AnimatedCharacter.m”驱动的IBActions。在我的例子中,“AnimatedCharacter.m”创建了一个NSTimer,它定期触发一个状态机,以决定如何处理该角色。它还通过标准方式实现音频播放。

除此之外,这些文件/代码没什么特别之处。换句话说,我没有做任何与众不同的事情来准备插入另一个UIViewController。

在主视图控制器.h文件中:

#import "AnimatedCharacter.h"

...

AnimatedCharacter *character;

...

@property (nonatomic, retain) AnimatedCharacter *character;

然后,在主视图控制器的.m文件中:

@synthesize character;

...

- (void)viewDidLoad 
{
character = [[AnimatedCharacter alloc] init];
character.view.frame = CGRectMake(54.0, 0.0, 150.0, 150.0);
[self.view addSubview:character.view];

...

有了这个,我现在可以做以下事情:

-(void)FadeOut:(SEL)selector
{
[UIView beginAnimations:@"resize" context:NULL];

    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:selector];

    character.view.frame    = CGRectMake(0.0, 0.0, 50.0, 50.0);

[UIView commitAnimations];
}

并且,通常通过“AnimatedCharacter.m”中的各种成员函数控制我认为合适的角色。这有效地作为笔尖内的笔尖。不是单独的线程,但两个笔尖都按预期履行职责,接收输入并运行各自的节目。

我对我选择做的好/坏/丑陋方面的评论感兴趣。