我想以正确的方式在UIViews之间切换。
这就是我目前的做法:
[myButton addTarget:self
action:@selector(switchToMySecondView:)
forControlEvents:UIControlEventTouchUpInside];
switchToMySecondView
中,我分配了新的UIViewController(mySecondViewController是当前类的属性):
MySecondViewController* mySecondView = [[MySecondViewController alloc] initWithNibName:@"SecondViewXib" bundle:nil];
self.mySecondViewController = mySecondView;
[mySecondView release];
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 50)];
myLabel.text = [aGlobalArray objectAtIndex:[sender tag]];
[mySecondViewController.view addSubView:myLabel];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
[mySecondViewController viewWillAppear:YES];
[self.view addSubview:mySecondViewController.view];
[mySecondViewController viewDidAppear:YES];
[UIView commitAnimations];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.40];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view.superview cache:YES];
[self.view removeFromSuperview];
[UIView commitAnimations];
确定。这很好。我毫不怀疑存在内存泄漏,但目前不是我的首要任务。
这是我的问题:
每次在第一个视图中单击我的按钮时,我都会在第二个视图中添加不同的UILabel(使用[sender tag]
中的aGlobalArray
索引。
每次将这个UILabel添加到我的第二个视图中时,它都覆盖在旧的UILabel上,所以我仍然可以看到两个UILabel。
UILabel就是一个例子。在我的应用程序中,我也添加了叠加的UIImages。
当我切换回第一个视图时,我尝试在我的secondView
中编写它:
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view.superview cache:YES];
[self.view removeFromSuperview];
[self release];
[UIView commitAnimations];
我的应用程序在2或3次切换/切换后突然停止,有时在控制台中没有任何消息,有时会显示一条消息,说我正在发布未分配的内容。
我做错了什么?
非常感谢任何帮助!
答案 0 :(得分:2)
您不应该在第二个视图控制器中重新创建UILabel。您可以在MySecondViewController *类中创建标签并将其作为属性公开。然后,只要您想切换到第二个视图,就可以执行以下操作:
mySecondViewController.theLabel.text = [aGlobalArray objectAtIndex:[sender tag]];
相反,您可以在首次创建时在UILabel上设置标记,然后使用viewWithTag检索标签。
编辑:当我说作为属性公开时,你会在界面中正常创建标签:
@interface MySecondViewController : UIViewController {
UILabel *label;
}
@property (nonatomic, retain) UILabel *label;
在实施文件中:
@implementation MySecondViewController
@synthesize label;
然后你只创建一次标签 - 即在MySecondViewController ViewDidLoad中或代替你的:
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 50)];
myLabel.text = [aGlobalArray objectAtIndex:[sender tag]];
[mySecondViewController.view addSubView:myLabel];
你可以这样做:
if (mySecondViewController.label == nil) {
mySecondViewController.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 50)];
[mySecondViewController.view addSubView:self.mySecondViewController.label];
}
mySecondViewController.label.text = [aGlobalArray objectAtIndex:[sender tag]];