1

我有UIViewControllerUILabel需要显示“lbs”或“kg”。我的应用程序有一个设置屏幕(另一个UIViewController),通过第一个视图控制器以模态方式呈现,用户可以选择两个单元中的任意一个并保存其偏好。如果单位改变,模式设置屏幕被解散,我当然希望第一个视图控制器上的标签更新为新的单位值(但不刷新整个视图)。我以为我知道如何使它工作,但显然我没有。哪里在视图模式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将被称为第二次,如果我在UINavigationController管理的UITableViewController的层次结构内工作,但在我解雇我的模态UIViewController以显示它下面的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) 

    } 
} 
+0

你在哪里添加'FUNC viewDidLoad中( )'?如果它在视图控制器中,Xcode应该抱怨你没有声明'override',你应该调用super。我想知道你是否在错误的类中添加了代码。 –

+0

另外,您能非常具体地描述底层视图控制器的视图层次结构吗?它是否在导航和/或标签控制器中? –

+0

对不起,@AaronBrager。 'viewDidLoad'在第一个视图控制器中。当我删除了一堆多余的代码时,我错误地删除了'override'和'super.viewDidLoad'。我已经纠正了上述情况。我还添加了视图层次结构的屏幕截图。 – Jim

回答

0

真正的问题

你拼错了viewWillAppear。你叫它:

func viewWillAppear() 

就可可触摸而言,这是一个随机无关的函数,挂钩到什么都没有。您的意思是:

override func viewWillAppear(animated: Bool) 

第一功能的全名是:“viewWillAppear

第二函数的全称是:“viewWillAppear:animated

一旦你习惯了这一点, 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)") 
    } 
} 

[剩余前面的讨论中删除,因为它是不正确的猜测]

+0

你是对的,它是初始视图控制器(计算器)和导航控制器之间的一个显示(例如Push)延续,但我保证,当设置按钮被点击并向下移动时,它会从底部向上并覆盖整个视图点击完成按钮时消失。为了排除故障,我在初始视图控制器的“viewWillAppear()”中放置了“print(”我将其设置为viewWillAppear()“),并且在设置被解散时不会打印第二次。我会尽力而为,也许这会告诉我一些事情 – Jim

+0

但是我仍然需要看到你的解雇代码 - 你的模拟我有。 – BaseZen

+0

而我的解雇代码是不同于你的,所以你试过吗? – BaseZen