在视图生命周期中,在模态UIViewController解除后更新控制器

时间:2016-08-05 02:02:25

标签: swift uiviewcontroller modalviewcontroller viewdidload viewdidappear

我有UIViewController UILabel需要显示“lbs”或“kg”。我的应用程序有一个设置屏幕(另一个UIViewController),它在第一个视图控制器上以模态方式显示,用户可以选择两个单元中的任何一个并保存其首选项。如果更改了单位并且取消了模态设置屏幕,我当然希望使用新单位值更新第一个视图控制器上的标签(但不刷新整个视图)。我以为我知道如何使它工作,但显然我没有。

在我的模态设置屏幕上,我有UISegmentedControl以允许用户选择单位。无论何时更改,此功能都会更新userDefaults

  func saveUnitsSelection() {
    if unitsControl.selectedSegmentIndex == 0 {
      UserDefaultsManager.sharedInstance.preferredUnits = Units.pounds.rawValue
    } else {
      UserDefaultsManager.sharedInstance.preferredUnits = Units.kilograms.rawValue
    }
  }

然后他们可能会关闭设置屏幕。所以,我在第一个视图控制器中将其添加到viewDidLoad

override func viewDidLoad() {
  super.viewDidLoad()

  let preferredUnits = UserDefaultsManager.sharedInstance.preferredUnits
  units.text = preferredUnits 
}

这不起作用,所以我把它移到了viewWillAppear(),这也没用。我做了一些研究和一些穴居人调试,发现在第一次加载/显示视图后,这两个函数都没有被调用。如果我在由viewWillAppear管理的UITableViewController层次结构中工作,似乎UINavigationController将被第二次调用,但是当我解除我的模态{{}时,我不会调用UIViewController 1}}显示其下方的UIViewController

编辑1: 这是我正在使用的视图层次结构: enter image description here

我有点陷入困境,不知道下一步该尝试什么。

编辑2: 用户可以点击导航栏中的“完成”按钮,当它们执行时,dismissSettings()功能会取消设置视图:

class SettingsViewController: UITableViewController {

  let preferredUnits = UserDefaultsManager.sharedInstance.preferredUnits
   // some other variables set here

  override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.topItem?.title = "Settings"

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(self.dismissSettings(_:)))

    if preferredUnits == Units.pounds.rawValue {
      unitsControl.selectedSegmentIndex = 0
     } else {
       unitsControl.selectedSegmentIndex = 1
     }
   }

  func dismissSettings(sender: AnyObject?) {
    navigationController?.dismissViewControllerAnimated(true, completion: nil)

  }
}

1 个答案:

答案 0 :(得分:0)

真正的问题

你拼错了viewWillAppear。你打电话给它:

func viewWillAppear()

就Cocoa Touch而言,这是一个无关紧要的随机函数。你的意思是:

override func viewWillAppear(animated: Bool)

第一个功能的全名是:" viewWillAppear"

第二个功能的全名是:" viewWillAppear:animated"

一旦你习惯了这个,极端的方法"重载" Cocoa Touch使用起来变得更容易。

在其他您可能至少收到警告的语言中,这是非常不同的。

发布问题时,每个人都需要学习的另一个教训是:包含所有相关代码!

有用的日志记录功能我使用而不是print或NSLog来帮助找到这些东西:

class Util {
    static func log(message: String, sourceAbsolutePath: String = #file, line: Int = #line, function: String = #function, category: String = "General") {
        let threadType = NSThread.currentThread().isMainThread ? "main" : "other"
        let baseName = (NSURL(fileURLWithPath: sourceAbsolutePath).lastPathComponent! as NSString).stringByDeletingPathExtension ?? "UNKNOWN_FILE"
        print("\(NSDate()) \(threadType) \(baseName) \(function)[\(line)]: \(message)")
    }
}

[之前的讨论已删除,因为这是错误的猜测]