当我使用存储属性创建UIView或创建子类时UIViewController,Xcode 不会编译我的项目,除非我包含required init?(coder aDecoder: NSCoder). 目前,我有以下实现来关闭编译器:
required init?(coder aDecoder: NSCoder) {
fatalError()
}
Run Code Online (Sandbox Code Playgroud)
我明白为什么我需要包含这个初始化程序;我的子类需要符合NSCoding协议,因为它的超类符合它,并且这个初始化器是NSCoding协议的一部分,所以它需要与我的类一起工作,即初始化我的类的所有存储属性(初始化器的超类版本会赢)做)。
我想一个正确的实现应该是这样的:
class MyView: UIView {
let label: UILabel
override init(frame: CGRect) {
label = UILabel()
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
if let label = aDecoder.decodeObject() as? UILabel {
self.label = label
} else {
return nil
}
super.init(coder: aDecoder)
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(label)
super.encode(with: aCoder)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,考虑到我的应用程序有 50 …
在我的 iOS 应用程序中,我使用以下 Firebase Analytics 函数调用:
Analytics.logEvent(AnalyticsEventSelectContent, parameters: [
AnalyticsParameterItemID: "id-button",
AnalyticsParameterContentType: "button"]
)
Run Code Online (Sandbox Code Playgroud)
我知道我可以为 ItemID 和 ContentType 参数添加任何内容String,但是每个参数的预期用途是什么?他们应该如何不同?
我正在尝试使用 aDateComponentsFormatter将秒数格式化为时间字符串 HH:MM:SS。我总是想显示分钟和秒字段,但如果小时数为 0,我不想显示小时数。我尝试设置
formatter.zeroFormattingBehavior = .dropLeading
Run Code Online (Sandbox Code Playgroud)
但是,如果小时和分钟都是 0,这也会导致分钟数被删除。
目前,我的解决方案如下:
if timeElapsed >= 3600 {
formatter.allowedUnits = [.second, .minute, .hour]
} else {
formatter.allowedUnits = [.second, .minute]
}
formatter.zeroFormattingBehavior = .pad
Run Code Online (Sandbox Code Playgroud)
但是,我担心这个解决方案非常笨拙,如果有一些国际化不认为一小时是 3600 秒,则该解决方案将无法正常工作。有更好的解决方案吗?
localization internationalization ios swift nsdatecomponentsformatter
通过Swift的最新更新,我可以使用Foundation和UIKit的类,函数等,而无需为它们包含import语句.如果我在Xcode中添加import语句,它会显示它被划掉,就像它被折旧一样.
是否不再需要在Swift中包含某些模块(如Foundation和UIKit)的import语句?
我正在尝试使用以下代码创建一个非常简单的 Firebase 性能跟踪:
let trace = Performance.startTrace(name: "setup")
setup()
trace?.stop()
Run Code Online (Sandbox Code Playgroud)
我希望此跟踪要做的就是跟踪 setup() 函数运行所需的时间。它似乎是第一次工作,但在那之后,我将此消息打印到控制台:[Firebase/Performance] Failed to start trace setup because it has already been started and stopped.
这个警告值得关注吗?如果是这样,我做错了什么导致此警告?
我有一个AVAudioPlayer存储在名为"播放器"的属性中.当用户单击按钮时,它会触发此代码:
@IBAction func restartPressed(sender: AnyObject) {
player.play()
}
Run Code Online (Sandbox Code Playgroud)
当用户非常快速地连续两次单击按钮时,就会出现问题.
如果第一次点击的声音仍在播放,则似乎忽略了第二次调用.
相反,我想要:
a)第二次点击按钮时,从头开始重启播放器; 要么
b)同时播放声音的两个"实例".
我将如何实现其中一个或两个选项?
如果我运行以下代码:
let date = Date()
let midnight = Calendar.current.date(bySetting: .hour, value: 0, of: date)!
let difference = Int64(midnight.timeIntervalSince(date))
print(String(difference))
Run Code Online (Sandbox Code Playgroud)
差异是大约13小时的正值(因为现在本地时间是大约11 AM)。但是,我希望两者之间的差值为11小时。由于我将.hour值设置为,0我希望时间会向后移动,而不是向前移动。
我希望明天必须使用以下代码找到午夜:
let midnight = Calendar.current.date(bySetting: .hour, value: 0, of:
Calendar.current.date(byAdding: .day, value: 1, to: date)!)!
Run Code Online (Sandbox Code Playgroud)
但这将使+37小时而不是+13小时。
当前的行为实际上是我想要的行为(我想知道直到明天午夜的时间)。但是,我想了解为什么会发生这种情况,尤其是要确保这种找到明天午夜的方法在任何时区都适用。谢谢!
编辑:请注意,我只关心午夜之前的时间,这就是为什么我不更改午夜时的分钟或秒值的原因。
我有一个xcode/objective-c项目,旨在与命令行(特别是iOS或mac)一起使用.该项目位于一个名为Prototype的文件夹中,在这个文件夹中我有一个文本文件:data.txt.我正在尝试创建一个方法来将data.txt的内容作为NSString返回.我使用以下代码成功完成了此操作:
+ (NSString *)loadTextFileToString:(NSString*)fileDest {
NSString *filePath = @"/Users/John/Documents/Objective-C/Prototype/Prototype/data.txt"
NSError *error = nil;
NSString *fileContent = [NSString stringWithContentsOfFile:filePath
encoding:NSASCIIStringEncoding
error:&error];
return fileContent;
}
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但我想用相对路径而不是绝对路径访问该文件.例如,在Eclipse中,我将使用路径"src/data.txt".我可以采用类似的方法在xcode/objective-c中创建相对文件路径吗?
swift ×7
ios ×4
firebase ×2
xcode ×2
localization ×1
nscoding ×1
nsdate ×1
objective-c ×1
uiview ×1