我想输出一个日期(具有相对日期,例如今天,昨天等)和时间(尊重iOS设备上的12/24小时设置)例如
像这样配置NSFormatter(并使用stringFromDate :)不起作用:
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; // doesn't respect am/pm setting on iOS device (grrr!)
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; // but does get relative dates
Run Code Online (Sandbox Code Playgroud)
这将为您提供相对日期,但默认为区域设置的12/24设置,例如美国为12小时,英国为24小时.(为什么Apple认为英国人喜欢24小时钟,我不知道...)
我采用的一种解决方法是使用两个NSDateFormatters,一个用于日期,一个用于时间.看来,当你配置一个NSDateFormatter,其日期风格为NSDateFormatterNoStyle,时间风格为NSDateFormatterShortStyle时,它确实尊重12/24小时设置.(所以只有在您设置了日期和时间样式时才会出现问题.)
我把我的工作包括在下面以防其他人有类似的问题.有更简单的方法吗?这个工作看起来有点尴尬,我不清楚它应该是多么自信,它将继续在未来的iOS版本中工作.
解决
- (NSString*) humanRelativeDateAndTimeAlt: (NSDate*) date;
{
NSDateFormatter* relativeDateFormatter = [[NSDateFormatter alloc] init];
[relativeDateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[relativeDateFormatter setTimeStyle:NSDateFormatterNoStyle]; // no time for this formatter
[relativeDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; // relative dates
NSString* datePart = [[self relativeDateFormatter] stringFromDate:date]; …
Run Code Online (Sandbox Code Playgroud) Apple的UIDocumentInteractionController文档presentOpenInMenuFromBarButtonItem:animated:方法声明"如果没有支持打开文档的注册应用程序,文档交互控制器不会显示菜单." 在我的应用程序中,我想显示一个按钮,当且仅当设备上有应用程序打开它时.(我只希望按钮弹出一个菜单来打开文件;我不想要QuickLook,复制或打印).事实上,如果按钮在那里,但没有注册可以打开相关文件的应用程序,则用户会获得令人不满意的按钮体验,该按钮在点按时不会执行任何操作.
那么 - 我能否知道是否有任何/不支持打开特定文档类型的注册应用程序?显然,UIDocumentInteractionController实例可以找到它.是否有公共API方法可以找到它?
问题:我正在设备A上处理iCloud文档,例如iPod Touch.然后我在设备B上更改文档的名称,例如我的Mac(通过Finder).变化进入云端,暂停后设备A可以听到它.
然后:
fileURL
属性获取名称更改并可以相应地更新我的界面 - 文档继续表现得像它应该的那样file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95
毫不奇怪,这个文件不会保存.任何人都可以解释发生了什么以及如何解决它?
背景
更改名称更改NSMetadataQuery
.因此,对于例如,我可以重命名未打开的文档,并且我的所有iCloud功能都可以正常工作.这个问题似乎只发生在打开的文档中.
其他iCloud功能正常工作,例如我可以在一台设备上更改内容,例如我的Mac,然后在另一台设备(例如我的iPod Touch)上检测并更新我的界面,该设备打开了相关的iCloud文档.
当我presentedItemDidMoveToURL:
向我的UIDocument子类添加覆盖时,我首先发现了这一点.覆盖可靠地获取在云中进行的名称更改,例如在另一个设备上重命名文档.然后有时 newURL是重命名文档的最终预期URL,即我可以从中提取新名称的一些合理的使用`lastPathComponent',更新我的界面等.在其他情况下newURL是其他目录中的文档,其中包含最后一个路径组件开始'purg-',例如purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.
- (void) presentedItemDidMoveToURL:(NSURL *) newURL;
{
[super presentedItemDidMoveToURL: newURL];
if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)])
{
[[self delegate] documentNameChanged: self];
}
}
Run Code Online (Sandbox Code Playgroud)该presentedItemDidMoveToURL:
方法似乎不是问题的根本原因.例如,如果我根本不重写该方法,但定期检查正在查看打开文档的viewController,那么有时重命名fileURL
后将返回新名称,有时它将返回`purg -.... '.所以问题似乎与如何处理重命名有关.
更新
正如al_lea指出的那样,这里的问题与此有关accommodatePresentedItemDeletionWithCompletionHandler:
.扩展al_lea的答案,我将下面的代码添加到我的UIDocument子类中.这解决了这个问题.
- (void) accommodatePresentedItemDeletionWithCompletionHandler: (void (^) (NSError *errorOrNil)) completionHandler
{
PresentedDocument* presentedDocument = [self retain];
[presentedDocument closeWithCompletionHandler: ^(BOOL success) {
NSError* …
Run Code Online (Sandbox Code Playgroud) NSCollectionViewFlowLayout生成一个布局,其右边距上的项目对齐,或者,如果容器只有一个项目的宽度,则居中项目.我期待一个对齐选项,例如在委托上,但我没有在文档中找到任何内容.是否需要继承NSCollectionViewFlowLayout才能实现此目的?
我正在允许在tableView行上滑动以在"正常"时调出"删除"按钮,即不是"编辑"模式.但在某些情况下,例如当用户按下UIToolbar中的按钮时,我想恢复正常状态,即删除删除确认.
showingDeleteConfirmation
是一个只读属性,所以没有setShowingDeleteConfirmation: NO
选择.我在这个SO问题中建议的解决方法没有运气.删除确认状态在reloadData
通话中保持稳定.
有谁知道如何强制单元格显示删除确认的状态?
我有以下预打包的系统 SF 映像:
UIImage(systemName: "location.fill")
Run Code Online (Sandbox Code Playgroud)
这可能看起来微不足道,但我如何调整它的大小以使其更大?谢谢你。
我有一个字典,我需要从中导出一个键数组和一个在键或值上排序为EITHER的值数组.
我的用例是文件夹列表.字典包含文件夹名称(键)和文件夹中的项目数(值).我想按键名(A到Z或Z到A)以及计数大小(从大到小或从小到大)排序.
在Swift中对键进行排序很容易.但我正在使用迭代来提供排序的值列表.这看起来不像Swift的做事方式,但是我对Swift中map/sort /等的理解还不足以让我看到更聪明的方法.
谁能解释一个聪明而简洁的Swift实现这一目标的方法?
我目前的代码是:
let dictionary = ["Alpha" : 24, "Beta" : 47, "Gamma" : 12, "Delta" : 33]
enum FolderOrder : Int {
case AlphaAtoZ
case AlphaZtoA
case SizeLargeToSmall
case SizeSmallToLarge
}
func folderList(fromDictionary: [String: Int], orderedBy : FolderOrder = .AlphaAtoZ) -> [String] {
switch orderedBy {
case .AlphaAtoZ:
return fromDictionary.keys.sort() {$0 < $1}
case .AlphaZtoA:
return fromDictionary.keys.sort() {$1 < $0}
case .SizeSmallToLarge:
return fromDictionary.keys.sort(){fromDictionary[$0] < fromDictionary [$1]}
case .SizeLargeToSmall:
return fromDictionary.keys.sort(){fromDictionary[$1] < fromDictionary [$0]}
}
} …
Run Code Online (Sandbox Code Playgroud)