Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 模式UIViewController解除后更新控制器的视图生命周期中的何处_Swift_Uiviewcontroller_Modalviewcontroller_Viewdidload_Viewdidappear - Fatal编程技术网

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
似乎将再次调用
,但在我关闭modal
UIViewController
以显示其下方的
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之间切换