Swift 模式UIViewController解除后更新控制器的视图生命周期中的何处
我有一个Swift 模式UIViewController解除后更新控制器的视图生命周期中的何处,swift,uiviewcontroller,modalviewcontroller,viewdidload,viewdidappear,Swift,Uiviewcontroller,Modalviewcontroller,Viewdidload,Viewdidappear,我有一个UIViewController,带有UILabel,需要显示“lbs”或“kg”。我的应用程序有一个设置屏幕(另一个UIViewController),它以模式显示在第一个视图控制器上,用户可以选择这两个单元中的任何一个并保存他们的首选项。如果单位被更改,并且模式设置屏幕被取消,我当然希望第一个视图控制器上的标签用新的单位值更新(但不刷新整个视图)。我以为我知道如何使它工作,但显然我不知道 在我的模式设置屏幕上,我有一个UISegmentedControl,允许用户选择单位。无论何时更
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
}
这不起作用,所以我把它移到了viewwillappearch()
,这也不起作用。我做了一些研究和caveman调试,发现在第一次加载/呈现视图之后,这些函数都没有被调用。如果我在由UINavigationController
管理的UITableViewController
的层次结构中工作,则viewwillbeen
似乎将再次调用,但在我关闭modalUIViewController
以显示其下方的UIViewController
时不会调用
编辑1:
以下是我正在使用的视图层次结构:
我有点被困在这一点上,不知道下一步该做什么
编辑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)
}
}
真正的问题
您拼错了视图将出现
。你称之为:
func viewWillAppear()
就Cocoa Touch而言,这是一个随机的无关函数,没有任何关联。你的意思是:
override func viewWillAppear(animated: Bool)
第一个函数的全名是:“视图将出现”
”
第二个函数的全称是:“视图将显示:动画的
”
一旦您习惯了这一点,Cocoa Touch使用的极端方法“重载”就会变得更容易
这在其他语言中是非常不同的,在这些语言中,您可能至少会得到一个警告
发布问题时,每个人都需要学习的另一个教训是:包括所有相关代码
我使用有用的日志记录功能,而不是打印或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)")
}
}
[由于猜测不正确,先前的讨论被删除]真正的问题
您拼错了视图将出现
。你称之为:
func viewWillAppear()
就Cocoa Touch而言,这是一个随机的无关函数,没有任何关联。你的意思是:
override func viewWillAppear(animated: Bool)
第一个函数的全名是:“视图将出现”
”
第二个函数的全称是:“视图将显示:动画的
”
一旦您习惯了这一点,Cocoa Touch使用的极端方法“重载”就会变得更容易
这在其他语言中是非常不同的,在这些语言中,您可能至少会得到一个警告
发布问题时,每个人都需要学习的另一个教训是:包括所有相关代码
我使用有用的日志记录功能,而不是打印或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)")
}
}
[由于猜测不正确,删除了之前的剩余讨论]您在哪里添加了func viewDidLoad()
?如果它在视图控制器中,Xcode应该抱怨您没有声明覆盖
,您应该调用super。我想知道您是否在错误的类中添加了代码。另外,您是否可以非常具体地描述底层视图控制器的视图层次结构?它是在导航和/或标签控制器内吗?很抱歉,@AaronBrager。viewDidLoad
位于第一个视图控制器中。当我删除一堆多余的代码时,我错误地删除了override
和super.viewDidLoad
。我已经纠正了上面的问题。我还添加了视图层次结构的屏幕截图。您在哪里添加了func viewDidLoad()
?如果它在视图控制器中,Xcode应该抱怨您没有声明覆盖
,您应该调用super。我想知道您是否在错误的类中添加了代码。另外,您是否可以非常具体地描述底层视图控制器的视图层次结构?它是在导航和/或标签控制器内吗?很抱歉,@AaronBrager。viewDidLoad
位于第一个视图控制器中。当我删除一堆多余的代码时,我错误地删除了override
和super.viewDidLoad
。我已经纠正了上面的问题。我还添加了视图层次结构的屏幕截图。你说得对,它是初始视图控制器(计算器)和导航控制器之间的一个显示(例如按下)阶段,但我保证,当点击“设置”按钮时,它会从底部出现,覆盖整个视图,当点击“完成”按钮时,它会向下移动,直至消失。为了排除故障,我将“print”(“我制作成ViewWillAspect()”放在`ViewWillAspect()的内部)'的初始视图控制器,当设置被取消时,它不会第二次打印。你是如何打印这些事件的?我会试试看,也许这会告诉我一些事情。但我仍然需要看到你的取消代码--你对我的模拟。我的取消代码与你的不同,所以你试过了吗?哦,我没听清楚我在“编辑2”中更改了它。不幸的是,行为仍然是一样的。对我来说,逐字复制你的代码非常有效。我很想知道问题出在哪里。情节提要可能已损坏。进行“清理”/“构建”吗?你能将整个项目上传到某个地方吗?你是对的,这是一场表演(例如推送)在最初的v之间切换