如何在UIViews之间正确切换

时间:2011-03-25 10:32:36

标签: iphone objective-c

我想以正确的方式在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];

  • 在mySecondViewController中添加一些内容......

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 50)];
myLabel.text = [aGlobalArray objectAtIndex:[sender tag]];
[mySecondViewController.view addSubView:myLabel];

  • 接下来,我使用UIAnimation显示它:

[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次切换/切换后突然停止,有时在控制台中没有任何消息,有时会显示一条消息,说我正在发布未分配的内容。

我做错了什么?

非常感谢任何帮助!

1 个答案:

答案 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]];