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 и добавляет его как подвью, а затем удаляет его на основе его тег.
Какой правильный подход следовать. Я считаю, что все три варианта звучат правильно. Но есть ли какой-то определенный способ, которым я должен следовать. Является ли какой-либо из этих вариантов лучше с точки зрения памяти и производительности?
Спасибо заранее,
Андреас
Ответы
Ответ 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"];