切换ViewController后UILabel恢复默认,如何在APP关闭前保持更新内容?
解决方案:保持ViewController内UILabel状态(无需代理)
明确说:不需要设置代理,只在你的ViewController内部做简单处理就能解决问题。
问题根源是你切换ViewController时,原ViewController可能被重复初始化(比如每次切回都新建实例),导致UILabel回到默认值。核心思路是确保你的ViewController实例在APP运行期间只创建一次,或者切换时保留已修改的状态。
具体实现步骤(纯代码无Storyboard):
方式1:用单例模式管理ViewController实例
在你的ViewController类中实现单例,保证全局只有一个实例,切换回来时用的还是之前修改过的那个:class YourViewController: UIViewController { static let shared = YourViewController() // 声明你的UILabel和UITextField let statusLabel = UILabel() let inputTextField = UITextField() private init() { super.init(nibName: nil, bundle: nil) setupUI() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setupUI() { statusLabel.text = "默认文本" // 给TextField绑定编辑完成事件,同步修改Label文本 inputTextField.addTarget(self, action: #selector(updateLabelText), for: .editingDidEnd) // 其他UI布局代码... } @objc private func updateLabelText() { if let text = inputTextField.text, !text.isEmpty { statusLabel.text = text } } }切换页面时直接调用
YourViewController.shared获取已存在的实例,不要每次新建。方式2:在导航/标签控制器中提前初始化实例
如果用UINavigationController或UITabBarController管理页面,在APP启动时就初始化好所有需要的ViewController,统一管理实例:// 在SceneDelegate的scene(_:willConnectTo:options:)方法中 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) let yourVC = YourViewController() let otherVC = OtherViewController() let navController = UINavigationController(rootViewController: yourVC) // 将otherVC加入导航栈或标签栏,确保实例只创建一次 window.rootViewController = navController self.window = window window.makeKeyAndVisible() }这种方式下原ViewController实例不会被销毁,UILabel的修改状态会一直保留到APP关闭。
关键注意点:
- 不要每次切换页面都执行
let vc = YourViewController()新建实例,这会直接导致之前的状态丢失。 - 不需要用UserDefaults,只要ViewController实例不被销毁,内存中的状态就会一直保留。
内容的提问来源于stack exchange,提问作者YanaCrew
相关产品推荐
相关产品推荐

