我正在尝试向我的应用添加主题(深色主题)。因此,当用户单击活动开关时,它将使整个应用进入暗模式。我对黑暗模式进行了硬编码,只是为了看看它会是什么样子。但是现在我希望能够通过和UISwitch启用和禁用它,但是我不确定该怎么做?
class DarkModeTableViewCell: UITableViewCell {
var DarkisOn = Bool()
let userDefaults = UserDefaults.standard
@IBOutlet var darkModeSwitchOutlet: UISwitch!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func darkModeSwitched(_ sender: Any) {
if darkModeSwitchOutlet.isOn == true {
//enable dark mode
DarkisOn = true
userDefaults.set(true, forKey: "DarkDefault")
userDefaults.set(false, forKey: "LightDefault")
} else {
//enable light mode
DarkisOn = false
userDefaults.set(false, forKey: "DarkDefault")
userDefaults.set(true, forKey: "LightDefault")
}
}
}
class DarkModeViewController: UIViewController {
func set(for viewController: UIViewController) {
viewController.view.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1.0)
viewController.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
viewController.navigationController?.navigationBar.tintColor = UIColor.white
viewController.navigationController?.navigationBar.barStyle = UIBarStyle.black
viewController.tabBarController?.tabBar.barStyle = UIBarStyle.black
}
static let instance = DarkModeViewController()
}
然后我要做的是在每个视图控制器中调用该函数以查看其外观,但是如果开关处于打开或关闭状态,那么我必须能够访问它的bool值,然后执行该操作该功能,否则将保持不变。如果您还有其他问题,请告诉我,我知道其中有些可能没有多大意义。
更新:此问题(因此也有此答案)是在宣布iOS 13之前编写的,因此它不使用iOS 13特定的API。
我会使用通知(NSNotificationCenter
API)解决此问题。
这个想法是在启用和禁用暗模式时实时通知视图控制器,以便它们也可以实时适应变化。您无需检查开关的状态或类似情况。
首先创建两个通知(您也可以只使用一个通知,并在userInfo
字典中传递所需的主题,但是在这种情况下,创建两个通知会更容易,因为您需要使用Swift进行强制转换,而不能使用诸如此类)。
NotificationsName+Extensions.swift
:
import Foundation
extension Notification.Name {
static let darkModeEnabled = Notification.Name("com.yourApp.notifications.darkModeEnabled")
static let darkModeDisabled = Notification.Name("com.yourApp.notifications.darkModeDisabled")
}
在所有“ themable”视图控制器上,收听以下通知:
override func viewDidLoad() {
super.viewDidLoad()
// Add Observers
NotificationCenter.default.addObserver(self, selector: #selector(darkModeEnabled(_:)), name: .darkModeEnabled, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(darkModeDisabled(_:)), name: .darkModeDisabled, object: nil)
}
不要忘记将它们删除deinit
,因为将通知发送到无效对象会引发异常:
deinit {
NotificationCenter.default.removeObserver(self, name: .darkModeEnabled, object: nil)
NotificationCenter.default.removeObserver(self, name: .darkModeDisabled, object: nil)
}
在“ themable”视图控制器中,实现darkModeEnabled(_:)
和darkModeDisabled(_:)
:
@objc private func darkModeEnabled(_ notification: Notification) {
// Write your dark mode code here
}
@objc private func darkModeDisabled(_ notification: Notification) {
// Write your non-dark mode code here
}
最后,切换您的开关将触发以下任一通知:
@IBAction func darkModeSwitched(_ sender: Any) {
if darkModeSwitchOutlet.isOn == true {
userDefaults.set(true, forKey: "darkModeEnabled")
// Post the notification to let all current view controllers that the app has changed to dark mode, and they should theme themselves to reflect this change.
NotificationCenter.default.post(name: .darkModeEnabled, object: nil)
} else {
userDefaults.set(false, forKey: "darkModeEnabled")
// Post the notification to let all current view controllers that the app has changed to non-dark mode, and they should theme themselves to reflect this change.
NotificationCenter.default.post(name: .darkModeDisabled, object: nil)
}
}
这样,当“主题”更改时,您的所有视图控制器将实时收到通知,并且它们将做出相应的反应。请注意,您需要采取措施在应用启动时显示正确的模式,但是我确定您正在这样做,因为您正在使用UserDefaults并大概检查了它们。同样值得一提的是NSNotificationCenter不是线程安全的,尽管这无关紧要,因为所有UI代码都应该放在主线程中。
有关更多信息,您可以查看NSNotificationCenter文档。
注意:此代码建立在OP的基础上。它可以简化(例如,您无需同时跟踪“亮”和“暗”状态)。
当我在开发iOS应用程序时,我需要在模拟器中测试它与黑暗模式选项,这样我就可以获得更清晰的应用程序用户界面。但当我去设置,我没有得到黑暗模式作为真实设备显示选项。
问题内容: 如何将应用内购买添加到iOS应用?所有细节都是什么,是否有示例代码? 这意味着可以将各种应用内购买添加到iOS应用中 问题答案: Swift用户可以查看有关此问题的My SwiftAnswer。或者,查看YedidyaReiss的Answer,它将这个Objective-C代码转换为Swift。 Objective-C用户 该答案的其余部分用Objective-C编写 App Stor
这似乎不起作用。 我还尝试在代码生成器使用的xml中添加架构名称,如 http://www.jooq.org/doc/3.5/manual/code-generation/codegen-advanced/
我想知道是否可以将spring的其他参数(如)添加到spring boot app中,以便将其作为服务运行。 我检查了由自动生成的脚本: 所以也许它可以通过maven插件的选项来完成,但是除了JVM参数之外找不到其他的,这不是那么有用...
当我将移动主题从浅色改为深色时,它会影响react原生应用程序的背景颜色。我只想让它始终保持白色,但当我改变我的移动主题从光明到黑暗时,它会变成白色到黑色。Android版本10 React原生版本0.61.5 React版本16.9.0
我有一个java应用程序,需要部署在weblogic服务器中。我目前正在为该应用程序制作ear文件。我的ear文件中有一个ejb jar。我想将log4j2 jar添加到此应用程序中。所以我的文件夹结构是 目前,我已经将JAR放在APP-INF文件夹/lib和META-INF/application中。xml我把JAR放在了模块中。这是我的申请表。xml 但它不接受log4j罐子。有什么解决方案吗