当我尝试本地化我的应用程序并为目标语言创建一个新的Main.strings文件时,我在界面构建器(标签,按钮,...)中创建的所有内容都会添加到新的Main.strings文件中(基本和语言)我可以相应地本地化文本.
但是当我稍后在界面构建器中向ViewController添加标签或按钮时,它不会自动添加到Main.strings文件中以获取基本和语言版本.
那么,我怎样才能找出按钮/标签的ObjectID是什么,以便我可以将它添加到字符串文件中?
或者是否有另一种方法可以强制Xcode自动将新添加的标签和按钮添加到这些文件中?
我有一个带有两个视图的选项卡栏:
然后我有一个数组,该数组将从视图控制器中更新为新内容(例如,仅附加新字符串)。
该数组填充表视图。现在,当应用程序启动时,表视图显示所有数组内容,但是当我通过选项卡栏移动到视图控制器、将内容添加到数组并通过选项卡栏移回表视图时,我无法更新表视图以便它从数组中提取新内容。
我尝试在和tableview.reloadData()中使用,但表视图不会重新加载,并且仍然显示它最初在应用程序启动时加载的数据,但不显示新内容。viewDidAppearviewDidLoad
override func viewWillAppear(_ animated: Bool) {
tableView.reloadData()
weightArray = UserDefaults.standard.array(forKey: "favorites") as! [String]
}
Run Code Online (Sandbox Code Playgroud)
这就是我填充表格视图的方式:
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return weightArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "FavoriteCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
let …Run Code Online (Sandbox Code Playgroud) 我在故事板中创建了一个简单的标签栏,其中有三个视图.标签栏效果很好,但是当我尝试通过选项卡中的按钮显示另一个视图控制器时,新视图将放置在整个屏幕上以及标签栏上.
这是我按下按钮时到目前为止呈现视图的方式:
@IBAction func buttonPressed(_ sender: UIButton) {
let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
self.present(newVC!, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
我的另一个想法是:
self.tabBarController?.present(vc!, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,这也没有用.
那么如何在标签栏中显示另一个视图控制器(以便仍然显示底部栏)?
这是我的问题:我正在尝试为 Double(或 Int)创建一个全局扩展,它可以在每个 ViewController 中使用,而无需重复每个 ViewController 文件顶部的代码。
例如:
extension Double {
var mileToFeet: Double {return self * 5280}
}
Run Code Online (Sandbox Code Playgroud)
当然我可以这样称呼它:
let feet = 26.mileToFeet
Run Code Online (Sandbox Code Playgroud)
显然,当我将扩展程序放在 ViewController 的顶部并在代码中使用它时,这很有效,但是我可以在哪里放置扩展程序以便我可以在任何地方使用它?
我试图将它放入 AppDelegate,但这不起作用?我在正确的轨道上吗?
谢谢
我正在尝试检查UserDefaults密钥是否存在,如果没有将其设置为我选择的标准值,但这里的堆栈溢出答案并没有帮助我实现这一点.
基本上我有几个UISwitch,一个打开,其余的从一开始就设置为关闭.现在我的问题是,当加载viewController并且那些键不存在时,我不知道如何将这些初始状态保存到UserDefaults中.
这就是我试图检查UISwitch的密钥是否存在以及是否将其设置为true的原因(因为这是我希望它的状态),然后再次检查密钥的bool是什么,并将UISwitch设置为它(这在另一次打开viewController时非常重要):
func setupSwitches() {
let defaults = UserDefaults.standard
//check if the key exists
if !defaults.bool(forKey: "parallax") {
switchParallax.setOn(true, animated: true)
}
//check for the key and set the UISwitch
if defaults.bool(forKey: "parallax") {
switchParallax.setOn(true, animated: true)
} else {
switchParallax.setOn(false, animated: true)
}
}
Run Code Online (Sandbox Code Playgroud)
当用户按下相应的按钮时,我设置了UserDefaults键,如下所示:
@IBAction func switchParallax_tapped(_ sender: UISwitch) {
let defaults = UserDefaults.standard
if sender.isOn == true {
defaults.set(true, forKey: "parallax")
} else {
defaults.set(false, forKey: "parallax")
}
}
Run Code Online (Sandbox Code Playgroud)
这显然有效,但问题出在上面的第一个代码中.
首先,我不确定如何检查它是否存在,如果没有将其设置为"true",并且由于该函数被称为setupSwitches(),它将在每次显示viewController时运行.
因此,我不知道是否有更好的方法(例如,由于内存问题)来检查密钥是否存在,如果没有将其设置为true,如果它已经存在,则从UserDefaults获取bool并将开关设置为正确的国家.
文档说,一个应用程序可以每年通过 SKSToreReviewController 要求用户三次进行评分。
大多数建议在 UserDefaults 中保存一个变量,并在使用几次后调用该函数。如果您每年调用该函数超过 3 次,会发生什么情况?App Store 会忽略这些电话并在一年后再次要求评级还是会出现某种错误?
如果应用程序已更新(即从 1.0 版跳转到 2.0 版)会发生什么?这 3 个请求会被重置吗?