小编Obl*_*ely的帖子

NSDateFormatter - 在某些情况下不遵守12/24小时(上午/下午)系统设置

我想输出一个日期(具有相对日期,例如今天,昨天等)和时间(尊重iOS设备上的12/24小时设置)例如

  • 今天下午5:48(在12小时模式下); 和
  • 今天17:48(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)

iphone nsdateformatter

16
推荐指数
2
解决办法
8150
查看次数

如何(以编程方式)判断是否有任何支持打开特定文档类型的注册应用程序?

Apple的UIDocumentInteractionController文档presentOpenInMenuFromBarButtonItem:animated:方法声明"如果没有支持打开文档的注册应用程序,文档交互控制器不会显示菜单." 在我的应用程序中,我想显示一个按钮,当且仅当设备上有应用程序打开它时.(我只希望按钮弹出一个菜单来打开文件;我不想要QuickLook,复制或打印).事实上,如果按钮在那里,但没有注册可以打开相关文件的应用程序,则用户会获得令人不满意的按钮体验,该按钮在点按时不会执行任何操作.

那么 - 我能否知道是否有任何/不支持打开特定文档类型的注册应用程序?显然,UIDocumentInteractionController实例可以找到它.是否有公共API方法可以找到它?

iphone uti ios

6
推荐指数
1
解决办法
3565
查看次数

iCloud - 在其他设备上重命名打开的文档有时会失败

问题:我正在设备A上处理iCloud文档,例如iPod Touch.然后我在设备B上更改文档的名称,例如我的Mac(通过Finder).变化进入云端,暂停后设备A可以听到它.

然后:

  • 有些时候一切都很好 - 我通过更改的fileURL属性获取名称更改并可以相应地更新我的界面 - 文档继续表现得像它应该的那样
  • 有些时候,文件的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)

iphone renaming ios icloud

5
推荐指数
1
解决办法
1242
查看次数

NSCollectionViewFlowLayout - 左对齐

NSCollectionViewFlowLayout生成一个布局,其右边距上的项目对齐,或者,如果容器只有一个项目的宽度,则居中项目.我期待一个对齐选项,例如在委托上,但我没有在文档中找到任何内容.是否需要继承NSCollectionViewFlowLayout才能实现此目的?

layout flow nscollectionview leftalign

4
推荐指数
3
解决办法
1207
查看次数

如何清除UITableViewCell上的删除确认状态

我正在允许在tableView行上滑动以在"正常"时调出"删除"按钮,即不是"编辑"模式.但在某些情况下,例如当用户按下UIToolbar中的按钮时,我想恢复正常状态,即删除删除确认.

showingDeleteConfirmation是一个只读属性,所以没有setShowingDeleteConfirmation: NO选择.我在这个SO问题中建议的解决方法没有运气.删除确认状态在reloadData通话中保持稳定.

有谁知道如何强制单元格显示删除确认的状态?

iphone uitableview ios

3
推荐指数
1
解决办法
1831
查看次数

使用 SF 符号时调整 UImage 的大小 - UIImage(systemName:)

我有以下预打包的系统 SF 映像:

UIImage(systemName: "location.fill")
Run Code Online (Sandbox Code Playgroud)

这可能看起来微不足道,但我如何调整它的大小以使其更大?谢谢你。

uikit uiimage image-resizing swift sf-symbols

3
推荐指数
2
解决办法
1374
查看次数

Swift:排序字典(通过键或值)并返回有序数组(键或值)

我有一个字典,我需要从中导出一个键数组和一个在键或值上排序为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)

arrays sorting dictionary swift

1
推荐指数
1
解决办法
2250
查看次数