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

相關問題