UIViewControllers 问题

Posted

技术标签:

【中文标题】UIViewControllers 问题【英文标题】:UIViewControllers problems 【发布时间】:2012-06-10 12:19:45 【问题描述】:

您好,感谢您的帮助。在 Xcode4 中使用 ViewControllers 时,我遇到了一个非常奇怪的问题。首先我不得不说我没有使用故事板,我更喜欢以编程方式创建任何 UI 元素。所以我设置了一个 UIButton,我希望它在按下时将我带到一个新的视图控制器。这是我用于按钮的代码:

-(void)settingsAndExportHandle:(UIButton *)buttonSender 
SettingsViewController* settingView = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
settingView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:settingView animated:YES];

这个按钮在 RootViewController 的 viewDidLoad 方法中初始化和分配。当我按下按钮时,我想切换到另一个视图控制器(在本例中为 SettingsViewController)。

奇怪的是,当我按下按钮时,翻转控制器的动画效果很好,但是当它完成时,我获得了与 RootViewControllers 完全相同的东西(相同的自定义视图,相同的按钮,相同的一切! )。问题是:我错过了什么?我不得不说我使用 ARC(自动引用计数),所以我不能释放或解除分配我在 RootViewController 上创建的视图和按钮。

任何帮助将不胜感激。谢谢大家!

【问题讨论】:

Offtopic:presentModalViewController 已弃用。请改用presentViewController:animated:completion: 我修好了这个!你知道是什么问题吗?我创建的新 UIViewController 类奇怪地在头文件中有这行代码:@interface SettingsViewController : ViewController @end 不幸的是,ViewController 是我的根视图控制器的名称。我将该行更改为 UIViewController (也就是说,名为 SettingsViewController 的新视图控制器将不是我自己的 ViewController 的子类(在这种情况下是我的根控制器),但将是 UIViewController 的子类(就像它的意思成为))。谢谢你们!解决了! 这真是难以置信的+1! 【参考方案1】:

推送和模态呈现视图控制器不会释放呈现它们的视图控制器。它只是将额外的视图控制器添加到堆栈中。您需要实现一个回调方法,以便当用户点击按钮返回根视图控制器时,您的设置视图控制器让根视图控制器知道将要发生的事情,以便您可以调用您编写的方法将界面重置回您需要的任何状态。你也可以使用viewWillAppear:,但这有点乱。

然而,根据 Apple 人机界面指南,用户期望当他们推送视图控制器或以模态方式呈现它时,他们所在的视图控制器将保存状态并完全按照他们的方式他们回来时把它留下了。如果在导航控制器上下文中未保留状态,则令人不安和烦人。当它以模态呈现时,它尤其很烦人。

考虑一下 - 用户在一个假设的邮件应用程序中。他们开始输入电子邮件并设置字体大小和颜色。他们点击添加附件按钮,该按钮会弹出一个模态视图控制器,允许他们选择图片。他们选择图片,模式视图被关闭,在您的实现中,邮件撰写界面将重置,电子邮件内容将消失,或者至少选择的字体大小和颜色将恢复为默认值。这不是一个好的体验。

【讨论】:

以上是关于UIViewControllers 问题的主要内容,如果未能解决你的问题,请参考以下文章

切换到新的 UIViewControllers 时如何从层次结构中删除 UIViewControllers?

UIViewControllers 问题

使用 UIViews 而不是 UIViewControllers 时可能出现的问题?

从其子 UIViewControllers 访问父 UIViewController

内存泄漏,多个 UIViewControllers 的其他问题

UIViewController 包含 UIViewControllers 流