Подтвердить что ты не робот

IOS - добавление/удаление подпрограммы программно

Хорошо. Я хочу добавить UIImageView в качестве подзаголовка, а затем удалить его через пару секунд, как работает заставка. Я нашел три разных подхода к этому, но я не могу понять, какой из них лучше всего подходит для Objective-C и Apple.

Ниже приведены три разных подхода:

1)   В моем MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

    MyViewController *myViewController;
    UIImageView *myImageView;
}


@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

и в MyAppDelegate.m

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

        myImageView.image=[UIImage imageNamed:@"Yoga.png"];


    [self.window addSubview:myImageView ];
    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{
    [myImageView removeFromSuperview];

    [myImageView release];

    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible];
}

2) во втором подходе:

In my MyAppDelegate.h


@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

    MyViewController *myViewController;
    UIImageView *myImageView;
}

@property (nonatomic, retain) IBOutlet UIImageView *myImageView;

@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

и в MyAppDelegate.m

@synthesize myImageView;

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

        myImageView.image=[UIImage imageNamed:@"Yoga.png"];


    [self.window addSubview:myImageView ];
    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{
    [myImageView removeFromSuperview];

    [myImageView release];

    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible];
}

- (void)dealloc
{
    [myViewController release];
    [myImageView release];
 }

3) в третьем подходе:

In my MyAppDelegate.h


@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

    MyViewController *myViewController;

}

@property (nonatomic, retain) IBOutlet MyViewController *myViewController;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

и в MyAppDelegate.m

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIImageView *myImageView =[[UIImageView alloc] initWithFrame:CGRectMake(0.0,0.0,self.window.frame.size.width,self.window.frame.size.height)];

    myImageView.image=[UIImage imageNamed:@"Yoga.png"];
    myImageView.tag=22;    

    [self.window addSubview:myImageView ];

    [myImageView release];

    [self.window bringSubviewToFront:myImageView];

    [self performSelector:@selector(removeImage) withObject:nil afterDelay:2.5];

    return YES;
}

-(void) removeImage
{

    for (UIView *subview in [self.view subviews]) {

    if (subview.tag == 22){

        [subview removeFromSuperview];

    }

}
    [self.window addSubview:myViewController.view];
    [self.window makeKeyAndVisible];
}

- (void)dealloc
{
    [myViewController release];

 }

Итак, подведем итоги. Первый подход не использует свойство для UIImage только переменной, второе использует свойство, а третий создает UIImage и добавляет его как подвью, а затем удаляет его на основе его тег.

Какой правильный подход следовать. Я считаю, что все три варианта звучат правильно. Но есть ли какой-то определенный способ, которым я должен следовать. Является ли какой-либо из этих вариантов лучше с точки зрения памяти и производительности?

Спасибо заранее,

Андреас

4b9b3361

Ответ 1

Если вы не собираетесь использовать изображение снова, нет необходимости держать указатель на нем. Кроме того, если вы используете IBOutlet, вам нужно также добавить представление в IB. В этом конкретном примере я бы сказал, что вариант 3 имеет наибольшее значение, особенно учитывая, что при таком выборе вы можете начать со стандартного шаблона "на основе представления" и просто добавить бит о представлении изображения и оставить остальных в покое. Однако последнее замечание 3 выбора; 2 сообщения в окно;

 [self.window addSubview:myViewController.view];

 [self.window makeKeyAndVisible];

Выйти за пределы любого метода. Вероятно, это просто ошибка копирования и вставки, но обратите внимание, что они должны располагаться в пределах "didFinishLaunchingWithOptions:"

Ответ 2

Вы можете использовать анимацию, прикрепленную к слою представления. Код ниже исчезает из вида - но есть много других способов его удалить. (вам нужно прикрепить структуру QuartzCore)

myImageView.layer.opacity = 0.0;
// this is the state the view will be in after the animation (e.g. invisible)

CABasicAnimation *theFade;

theFade = [CABasicAnimation animationwithKeyPath:@"opacity"];
theFade.duration = 10.0; 
theFade.fromValue = [NSNumber numberWithFloat:1.0]; // i.e. visible
theFade.toValue = [NSNumber numberWithFloat:0.0]; // i.e. invisible 
[myImageView.layer addAnimation:theFade forKey:@"animateOpacity"];