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 
    } 
    } 

그런 다음 그들은 가능성 설정 화면을 기각한다.

override func viewDidLoad() { 
    super.viewDidLoad() 

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

작동하지 않았다, 그래서 나는 viewWillAppear()로 이동하고 그 중 하나가 작동하지 않았다 : 그래서, 나는 나의 첫 번째보기 컨트롤러에 viewDidLoad이 추가되었습니다. 나는 약간의 조사와 일부 원시인 디버깅을했는데 처음으로 뷰를로드/표시 한 후에도이 함수들 중 어느 것도 호출되지 않는다는 것을 알았습니다. viewWillAppearUINavigationController에 의해 관리되는 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"당신은 이것에 익숙해지면

의 코코아 터치가 사용하는 극단적 인 방법 "오버로딩"이 더 쉽습니다.

이것은 적어도 경고를받을 수있는 다른 언어에서는 매우 다릅니다.

질문을 게시 할 때 모두가 알아야 할 다른 교훈은 다음과 같습니다. 모든 관련 코드 포함!

유용한 로깅 기능 나는이 일을 찾을 수 있도록, 대신 인쇄 또는 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

당신은 초기보기 컨트롤러 (계산기)와 네비게이션 컨트롤러 사이의 쇼 (예 : 푸시) 세그먼트라는 것이 맞지만, 설정 버튼을 두드리고 아래로 내려갈 때 전체보기를 덮고 바닥에서 올라 오는 것을 약속합니다. 완료 버튼을 두드리면 사라집니다. 문제를 해결하기 위해 초기보기 컨트롤러의'viewWillAppear() '안에 printWillAppear()을 만들었고 Settings가 닫히면 두 번째로 인쇄하지 않습니다. 어떻게 이러한 이벤트를 인쇄 했습니까? 그걸 시도해 볼게, 아마도 나에게 뭔가 말해 줄게. – Jim

+0

그래도 나는 당신의 해고 코드 - 내가 가지고있는 것의 아날로그를 볼 필요가있다. – BaseZen

+0

그리고 나의 해산 코드가 너와 다르므로 해봤 니? – BaseZen