我有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
。
我有点陷入困境,不知道下一步该尝试什么。
编辑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)
}
}
答案 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)")
}
}
[之前的讨论已删除,因为这是错误的猜测]