小编rob*_*cer的帖子

如何获取UITextField的textContentType属性来执行任何操作?

这是关于UITextField的textContentType属性的文档:

使用此属性可为键盘和系统提供有关用户输入内容的预期语义含义的信息.例如,您可以指定UITextContentTypeEmailAddress用户填写的文本字段以接收电子邮件确认.当您提供有关您希望用户在文本输入区域中输入的内容的此信息时,系统可以在某些情况下自动选择适当的键盘并改进键盘更正并主动与其他文本输入机会集成.

由于应尽可能具体地标识每个文本输入区域的预期语义含义,因此不能为一个textContentType属性组合多个值.有关可以使用的值,请参阅文本内容类型 ; 默认情况下,此属性的值为nil.

这看起来非常简单,但我无法弄清楚如何让它实际做任何事情.我创建了一个简单的演示应用程序,添加了一个文本字段和设置self.textField.textContentType = UITextContentTypeEmailAddress.然后我在带有iOS 10.0.1的iPhone 7上运行它.

至少我希望这能自动选择电子邮件键盘,而不必明确设置它.它没有 - 我在我的iPhone上获得标准键盘.

我还希望它能够显示我自己的QuickType建议的电子邮件地址.我已经看到这种情况发生在其他地方 - 如果我在Safari中并且它检测到我正在编辑电子邮件字段,它会显示我的家庭和工作电子邮件地址作为建议.同样,它在这里没有这样做,即使文档表明应该这样做.

即使我还设置了keyboardTypeUIKeyboardTypeEmailAddress,我仍然没有得到QuickType建议,我所期待的.

有一个WWDC演讲讨论了这个新功能,但除了设置这个单一属性之外,你从来没有任何建议需要做任何事情.

我错过了一些步骤,还是这实际上并没有做我期待的事情?

objective-c uitextfield uikit ios

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

处理后台位置更新和Core Data文件保护

我一直在尝试CLLocationManagerstartMonitoringSignificantLocationChanges,我碰到的一些问题与核心数据.事实证明,自iOS 5.0以来,Core Data默认使用NSFileProtectionCompleteUntilFirstUserAuthentication.这意味着如果设置了密码,则持久存储在设备打开时不可用,直到首次输入密码为止.如果您正在使用位置更新,那么您的应用可能会在此期间启动,并且Core Data将尝试加载持久存储时出错.

显然,转换NSFileProtectionNone是解决这个问题的最简单方法.我不想这样做 - 我没有在数据库中存储任何超级敏感的东西,但这些位置更新也不是超级关键.

我知道我可以[[UIApplication sharedApplication] isProtectedDataAvailable]用来检查数据是否已经解锁,并且我可以applicationProtectedDataWillBecomeUnavailable:在我的应用程序委托中使用它一旦解锁就做出适当的响应.这对我来说似乎很麻烦 - 我必须添加一些额外的检查,以确保如果持久存储不可用则没有出错,一旦它变得可用就重新设置一堆东西,等等.而额外的代码并没有提供太多的好处 - 如果它在这种状态下启动,应用程序仍然无法执行任何操作.

所以我想我只是不确定哪种方式更合适":

  1. 切换到NSFileProtectionNone.
  2. 如果商店不可用,请添加额外的检查以跳过事物,并applicationProtectedDataWillBecomeUnavailable:在用完之后再次设置.
  3. 如果应用程序在后台启动([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)并且受保护的数据不可用([[UIApplication sharedApplication] isProtectedDataAvailable] == NO))只需调用exit(0)(或类似的东西)退出应用程序.一方面,这似乎是最简单的解决方案,我没有看到任何缺点.但它似乎......"错了"?我想我无法决定它是一个干净的解决方案还是一个懒惰的解决方案.
  4. 还有别的我想不起的东西?

cocoa-touch core-data cllocationmanager

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

本地化编辑菜单和其他标准菜单

我正在尝试将我的Mac应用程序翻译成几种不同的语言.OS X提供了大量菜单项,特别是在"编辑"菜单中,可自动运行.我假设这些项目也会自动翻译,但它们似乎不是.正如您在下面的屏幕截图中看到的,我正在混合使用已翻译和未翻译的项目.

奇怪的是,相同的菜单项在出现在上下文菜单中时会被翻译,例如在NSTextView中.在这种情况下,除了底部的两个服务之外,所有内容都会自动翻译.

上下文菜单,自动翻译

所以我很困惑:我真的要自己翻译编辑菜单吗?我显然希望我的翻译与Apple的翻译相匹配,所以我会做很多的复制和粘贴.或者是否有一些秘密来启动本地化?我的应用程序需要10.7或更高版本,所以如果有任何新的东西使这更容易,这应该不是一个问题.

附录:假设没有更简单的方法可以做到这一点,至少有一种简单的方法可以复制Apple翻译的文本,这样我就可以将它们粘贴到我的应用程序中了吗?我以为我可以从他们的一个应用程序中打开一个NIB,但它们都已编译,无法在Xcode中打开.我可以在文本编辑器中打开它们,但尝试以这种方式找到合适的字符串似乎没有比重新输入所有内容更快.

cocoa localization

7
推荐指数
2
解决办法
1571
查看次数

在OS X Yosemite(10.10)中从框架加载图像的最佳方法是什么?

我正在开发一个包含Notification Center小部件(或Today扩展)的Yosemite应用程序.我有一个框架,我将存储我的所有共享代码和资源,其中包括一些图像.无论我是使用PNG还是资产目录,如果我只使用标准NSImage方法,它们都不会加载imageNamed:.看一下文档,这显然是预期的 - 它只在主要包中查找.

在iOS上,UIImage有一个新的方法,imageNamed:inBundle:compatibleWithTraitCollection:这是完全适合这个问题.我没有看到类似的东西NSImage.

看起来最好的选择是做这样的事情:

[[NSBundle bundleForClass:[self class]] imageForResource:@"name"];
Run Code Online (Sandbox Code Playgroud)

这个问题的主要问题是它不使用缓存.为了做到这一点,我在一个类别中添加了我自己的方法:

+ (NSImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
    NSImage *image = [NSImage imageNamed:name];
    if (image == nil) {
        image = [bundle imageForResource:name];
        [image setName:name];
    }
    return image;
}
Run Code Online (Sandbox Code Playgroud)

这似乎没问题,但有更好的解决方案吗?

cocoa nsimage nsbundle osx-yosemite

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

如何在iPhone 6或5s上支持横向分割视图?

在我的应用程序有一个在景观浪费了不少空间,在iPhone 6,并在较小的程度上,甚至在4" 的画面.我已经使用的iOS 8的UISplitViewController更改,以支持横向两个窗格视图在iPhone 6加,但在一些较小的设备上看到两个窗格也很有用.

方便的是,Apple有一个WWDC 2014会议,"使用UIKit构建自适应应用程序",其中包含有关如何执行此操作的详细信息.您可以在此处下载示例代码,但简而言之:它们将子类放在UISplitViewController内部UIViewController.当子类考虑宽度足够宽时,子类用于setOverrideTraitCollection:forChildViewController:强制[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]拆分视图.当时示例代码运行良好,并且仍然在大多数设备上运行.

但是在尝试在我自己的应用程序中使用此代码之后,我发现它在iPhone 6 Plus上失败了.如果您下载示例代码并进行两项更改,则可以自己查看:

  • 添加一个故事板,向其添加一个空视图控制器,并将其设置为"启动屏幕文件".这是在6 Plus上以原始分辨率运行应用程序所必需的.
  • AAPLTraitOverrideViewController.m,将第21行更改为size.width > 500.0或大于414的任何内容.这是确保拆分视图仅在6 Plus上以纵向显示单个视图所必需的.

现在您可以在模拟器中运行该应用程序.要查看问题,请执行以下操作:

  • 将设备旋转为横向(命令右箭头)
  • 立即将其旋转回肖像(命令左箭头)

你已经可以看到一些不对劲的东西了.所有表格单元格的右侧都应有一个箭头,但它们不是.他们表现得像他们仍处于分裂视野中.如果您点击其中一行,情况会变得更糟 - 细节视图从底部向上滑动,导航栏就消失了.

我认为iOS 8中必定存在一个导致问题的错误.但由于此代码是在iPhone 6 Plus发布之前共享的,因此它似乎也需要进行一些调整才能使其与该设备兼容.到目前为止,我发现的唯一解决方案是将第21行更改为类似if (size.width > 500.0 && size.width < 736.0)但我不想使用下次Apple引入新屏幕尺寸时可能再次破坏的代码.有没有更好的方法来处理这个?

cocoa-touch uikit uisplitviewcontroller

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