小编epo*_*gee的帖子

如何摆脱'未声明的选择器'警告

我想在NSObject实例上使用选择器,而不需要实现协议.例如,如果调用它的NSObject实例支持它,则应该设置一个类别方法.这是代码,代码按预期工作:

if ([self respondsToSelector:@selector(setError:)])
{
    [self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器看不到setError:signature的任何方法,因此它为包含该@selector(setError:)代码段的每一行提供了警告:

Undeclared selector 'setError:'
Run Code Online (Sandbox Code Playgroud)

我不想声明一个协议来摆脱这个警告,因为我不希望所有可能使用它的类实现任何特殊的东西.按惯例,我希望他们有setError:方法或财产.

这可行吗?怎么样?

干杯,
EP

objective-c selector categories

160
推荐指数
6
解决办法
7万
查看次数

XCode 4"Clean"与"Clean Build Folder"

您在每个应用程序的开发中都会遇到某种情况,您在模拟器中看到的内容与您认为应该发生的内容不匹配.大多数情况下这些是人为错误 - 或者至少它们在我的大多数情况下都是;-) - 但有时Xcode只是"失去了轨道",或者看起来如此.我了解到Clean(Shift + Cmd + K)和Clean Build Folder…(Option + Shift + Command + K)菜单选项可以显示错误或Xcode之间的差异.

我的问题是:

什么是Clean命令做还是不做,留下一个理由Clean Build Folder…存在吗?我何时应该选择另一个,为什么不总是清理整个文件夹?

xcode objective-c ios xcode4

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

将Xcode组创建为文件系统文件夹的工作流程

我喜欢在Xcode 4项目导航器窗格中将我的类组织成组.我也通过终端使用GIT版本,这对我来说比Xcode 4集成更好.对我来说,当我在Xcode中创建的组对应于我的文件系统上的真实文件夹时,它是最有意义的.

但是,Xcode似乎并不关心文件系统中的文件(例如Objective-C .h/.m文件)的位置,每次添加一个group(Option+Command+N)时,它都是纯粹的装饰,因为你放在那里的任何文件都会分享与其余硬盘相同的位置.

奇怪的是,如果您首先在硬盘驱动器上创建一个文件夹,然后将其拖到Xcode,那么您已经在文件系统上创建了一个具有自己位置的组.您在其中创建的每个文件都将在磁盘上的文件夹中创建.我喜欢这个,但如果Xcode会为我做这件事,我会更喜欢它Option+Command+N.为您要创建的每个组切换到Finder的工作流程,然后将其拖回到项目导航器中的正确位置,这简直太愚蠢了.

感觉就像设置会修复,但我找不到它!有没有更好的办法?

更新:将文件夹拖动到Xcode时,您将看到一个对话窗口,您可以在其中选择"文件夹参考".这看起来很有希望,但是我的Xcode 4不接受那里的文件作为类,并一直告诉我它找不到任何文件.也许答案就在这里,但我仍然找不到它.

另一个更新:我已将主编辑器环境从Xcode更改为AppCode.后者支持实际创建文件夹以支持项目组,同时保持与Xcode的100%兼容性.那些AppCode的人肯定知道他们在做什么.

xcode file-organization objective-c xcode4

62
推荐指数
3
解决办法
3万
查看次数

多个(两个)持久性存储可以与一个对象模型一起使用,同时保持从一个到另一个的关系吗?

介绍

我的iOS项目附带一个Core Data持久存储,重量约为160MB,采用SQLite格式.那里有大量的分组信息,用户应该可以在其中标记收藏.为此,我需要(至少部分)数据库具有写入功能.但当然,应用程序包中的持久存储是按设计只读的.

如果您希望商店具有读写功能,则应将其复制到例如应用程序的文档文件夹中.我不想这样做,因为那时应用程序将是两倍大小,而该数据库的主要部分仍然是只读的.那将浪费资源.

NSPersistentStoreCoordinator的多个持久存储

这就是为什么我想到使用两个持久存储.第一个是捆绑中的大一个,第二个可能是文档文件夹中的一个小的,存储与大商店有关系的特殊"最喜欢"实体.

我知道在这方面有可能做到,但我找不到具体细节.如果您还有多个对象模型,是否应该只使用多个商店?一个对象模型可以在两个持久存储上"分布"吗?浏览核心数据编程文档时,我找不到任何关于如何设置它的真正参考.Marcus Zarra的书似乎也没有深入研究这个主题:

可以向NSPersistentStoreCoordinator添加多个NSPersistentStore,这在处理拆分为多个文件的数据时非常有用.但是,在我们的例子中,我们只有一个文件.(Marcus Zarra:"核心数据 - Apple在Mac OS X上保存数据的API"第71页)

问题

谁可以告诉我,我在想什么是可能的Core Data和多个持久存储?你能提供一些关于如何实现这一目标的提示吗?处理该主题的在线/离线资源也非常受欢迎.

cocoa-touch core-data objective-c multiple-databases

41
推荐指数
2
解决办法
1万
查看次数

为什么UITableViewCell上的所有背景都会消失?

我当前项目的UITableViewCell行为令我感到困惑.我有一个相当简单的UITableViewCell子类.它为基本视图添加了一些额外的元素(通过[self.contentView addSubview:...]并设置元素上的背景颜色,使它们看起来像黑色和灰色矩形框.

因为整个表格的背景具有这种具体的纹理图像,所以每个单元格的背景都需要透明,即使在选中时也是如此,但在这种情况下它应该变暗一点.我已经设置了一个自定义的半透明选定背景来实现这个效果:

UIView *background = [[[UIView alloc] initWithFrame:self.bounds] autorelease];
background.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
background.opaque = NO;

[self setSelectedBackgroundView:background];
Run Code Online (Sandbox Code Playgroud)

虽然这样会产生正确的背景效果,但当我选择单元格时会出现奇怪的副作用; 所有其他背景在某种程度上turnt 关闭.这是一个截图.底部单元看起来应该并且未被选中.顶部单元格被选中,但它应该显示黑色和灰色的矩形区域,但它们已经消失了!

模拟器的屏幕截图. 选择顶部单元格,底部不选择.

谁知道这里发生了什么,更重要的是:我怎么能纠正这个?

cocoa-touch objective-c uitableview subclassing

40
推荐指数
4
解决办法
2万
查看次数

由于iOS地址簿API中的链接卡而处理重复的联系人

我即将推出的应用的一些测试用户报告说,联系人列表包含大量重复记录.我正在使用结果ABAddressBookCopyArrayOfAllPeople作为我自定义的联系人表视图的数据源,这让我感到困惑,结果与iPhone的"联系人"应用程序不同.

当仔细查看"联系人"应用程序时,重复项似乎来自具有"链接卡"的条目.下面的屏幕截图有点混淆,但正如你在我最右边的应用程序中看到的那样,"Celine"显示两次,而在左边的Contacts应用程序中只有一个"Celine".如果您单击该单个联系人的行,您将获得一张带有两个"链接卡"的"统一信息"卡(如中心所示,我没有使用Celine的联系方式,因为它们不适用于一个屏幕截图):

截图

围绕"联卡"的问题,有相当几个主题苹果的论坛上为最终用户,但除了一个事实,即许多点到404支持页面,我不能真实地去周围固定了我所有的应用程序的用户的地址簿.我更愿意优雅地处理它而不会打扰用户.更糟糕的是,似乎我不是唯一一个有这个问题的人,因为WhatsApp显示的是包含重复联系人的相同列表.

为了清楚重复联系人的起源,我不是存储,缓存或以其他方式试图聪明地了解数组ABAddressBookCopyArrayOfAllPeople返回.因此,重复记录直接来自API调用.

有谁知道如何处理或检测这些链接卡,防止重复记录显示?Apple的联系人应用程序可以做到,我们其他人也可以这样做吗?

更新:我写了一个库并把它放在Cocoapods上以解决手头的问题.请参阅下面的答案

cocoa-touch objective-c duplicates abaddressbook abrecord

38
推荐指数
4
解决办法
1万
查看次数

view.alpha = 0 vs view.hidden = YES有什么影响?

透明度是邪恶的,在iOS设备上甚至比在更重的机器上更加邪恶.因此,我认为首先使用view removeFromSuperView,如果不适用view.hidden=YES,作为最后的手段view.alpha=0.但实际上我不知道幕后发生了什么.是否存在差异,尤其是后两者之间?

我有一个UIView animateWithDuration:animations:completion:场景,如果你在完成块中放入hidden = YES,它将隐藏而不让动画块完成.因此我不得不求助于alpha = 0.

一个人对另一个人的惩罚是什么?干杯,EP.

transparency cocoa-touch ios

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

如何将自动旋转约束到某些视图的单一方向,同时允许其他方向的所有方向?

这个问题是关于UINavigationController中的iOS设备旋转和多个受控视图.有些观点应该限制为纵向,有些观点应该自由旋转.如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常令人讨厌的怪癖.然而,这个场景非常简单,所以我想我要么没有正确地进行自动旋转实施,要么就是忘了什么.

我有一个非常基本的演示应用程序,显示了怪异,我制作了一个视频显示它在行动.

设置非常基本:调用三个视图控制器FirstViewController,SecondViewController并且ThirdViewController所有扩展AbstractViewController显示带有类名称的标签,并且shouldAutorotateToInterfaceOrientation:当设备处于纵向时返回YES .SecondViewController重写此方法以允许所有旋转.所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/关闭来在视图之间导航UINavigationController.到目前为止,我想说的是一个非常简单的场景.

如果您以纵向或横向方向握住设备,这是我不仅希望实现的结果,而且还期望.在第一张图片中,您会看到所有视图都是"直立",而在第二张图片中,您会看到只有第二个视图控制器反转设备的方向.要清楚,应该可以从横向模式的第二个视图导航到第三个视图,但因为第三个视图仅支持纵向方向,所以它应该只能以纵向显示.查看结果是否正常的最简单方法是查看载体条的位置.

纵向模式下设备的预期视图方向 横向模式下设备的预期视图方向

但这个问题在这里是因为实际结果完全不同.根据您在旋转设备时所处的视图,并根据您导航到下一个视图,视图将不会旋转(具体而言,didOrientFromInterfaceOrientation:永远不会调用该方法).如果你在第二个横向并且导航到第三个,它将具有与第二个相同的方向(=坏).但是,如果您从第二个导航回到第一个,则屏幕将旋转为"强制"纵向模式,并且载波条将位于设备的物理顶部,无论您如何握住它.视频更详细地显示了这一点.

横向模式下设备的实际视图方向

我的问题是双重的:

  1. 为什么第一个视图控制器会向后旋转,而不是第三个?
  2. 当您只希望某些视图自动旋转而不是其他视图时,需要采取哪些措施才能从您的视图中获取正确的行为?

干杯,EP.

编辑:作为奖励之前的最后一招,我完全重写了这个问题,使其更短,更清晰,并希望更有吸引力给出答案.

cocoa-touch objective-c uiviewcontroller uinavigationcontroller device-orientation

30
推荐指数
2
解决办法
1万
查看次数

如何使用更具体的类型覆盖超类的属性?

方案
我有一种情况,其中一个被调用的基类AbstractRequest具有id <AbstractRequestDelegate>在头文件中声明的类型的委托属性:

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

抽象代表协议包含一些必要方法,并且与字"抽象"所指出的,无论是AbstractRequestAbstractRequestDelegate旨在是子类/扩展.

其中一个例子是子类ConcreteRequest和扩展协议ConcreteRequestDelegates,它们都为抽象方法添加了额外的方法.目的是抽象和具体类方法都可以将消息发送到单个分配的委托实例.

在某个时间点,ConcreteRequest想要调用由ConcreteRequestDelegate定义的委托上的方法.由于委托的类型是id,因此编译器将发出警告,指出可能未实现此方法.

ConcreteRequest.m:38:警告:属性'委托'需要定义方法'-delegate' - 使用@synthesize,@ dynamic或提供方法实现

问题
这个警告是合理的,因为该属性毕竟是打字的id <AbstractRequestDelegate>.为了解决这个问题,我想向编译器说明分配给具体实例的委托必须是类型id <ConcreteRequestDelegate>.这对我来说听起来很合理,所以我在ConcreteRequest标头中添加了一个新属性,希望覆盖它的抽象:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

但这是编译器不同意我的地方,可能是有充分理由的.我本以为它会用一个错误的类型覆盖一个超级类的属性发出警告,但它只是要求我重新合成这个新属性.我不想去那里,因为那时超类的方法将无法访问相同的委托属性.

问题
有没有办法在具体子类中"重新声明"具有添加的类型信息的属性?或者你能否发现我的想法中的错误,因为这可能是一个相当常见的问题,直到现在我还没有遇到过?

干杯,
EP.

PS这项工作中出现的所有类和协议名称都是虚构的.任何与真实类和协议名称,开源或专利的相似之处纯属巧合.

overriding synthesis properties objective-c subclassing

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

Apple何时开始拒绝使用Xcode 4.x构建的应用程序?

更新

2013年12月17日,Apple发布了一份声明,说明他们何时会强迫所有人使用Xcode 5提交新应用:

"从2月1日开始,提交给App Store的新应用和应用更新必须使用最新版本的Xcode 5构建,并且必须针对iOS 7进行优化."

iOS 7最初于2013年6月10日宣布,Xcode 5.x将于2013年10月22日发布.在宣布iOS 7和强制执行Xcode 5提交之间的时间跨度接近8个月,Xcode的发布在中间非常好.


原始问题

使用Xcode 4.x构建的应用程序(针对iOS 6.x SDK)将在iOS 7上以一种传统模式运行,模拟黑色状态栏,旧UISwitch外观等功能.我不知道是否这个模式用某个名字记录在某个地方,或者由于NDA限制而没有讨论,但是我找不到任何有关它的细节(赞成这个模式的规范接受的名称).

如果您在没有任何Xcode 5修改的情况下编译同一个应用程序,它将被编译为一流的iOS 7公民,具有新的状态栏外观和控件.事实上,我在Xcode 5中找不到任何方式让应用程序在遗留模式下启动(我会就任何非NDA违规提示对此进行评论,但真正的问题是关于其他事情).

我目前正在处理的应用程序在这种传统模式下工作,但是在使用Xcode 5进行编译时会因为iOS 4.x代码非常老而崩溃.这当然可以解决,但是在短期限内,客户要求我解决它,首先关注一组功能,然后才将项目更新为"真正的"iOS 7应用程序.

在权衡过去几年的所有谣言和经历时,iOS 7的推出应该迫在眉睫.我正在处理的更新作为iOS 6更新提交到App Store绝对至关重要.据我所知,这意味着应用程序必须使用Xcode 4构建,本质上使用iOS 6.x(或在构建设置中调用的iphoneos6.1)的基本SDK集.

http://i.stack.imgur.com/LISDN.png

我假设苹果公司将在推出iOS 7的某个时候开始拒绝使用Xcode 4和iOS 6 SDK构建的应用程序,以推动真正的iOS 7应用程序的采用,逐步淘汰传统模式的必要性.有了这个,我希望在他们开始拒绝'旧学校'应用程序之前瞄准iOS 6应用程序提交,但我没有真正的知识何时可能.

所以这是真正的问题:

在以前的iOS版本中是否有类似这样的案例,Apple开始拒绝使用旧版Xcodes或SDK构建的应用程序?发布iOS版本和Apple拒绝应用程序之间的时间间隔是我最感兴趣的.

PS这是一个论坛帖子,似乎表明在iOS 6发布期间发生了这种情况,但最后一篇文章贬低了它:http://www.cocos2d-iphone.org/forums/topic/apple-dev-support-says-所有的应用程序,必须-现在待内置有-IOS-6-SDK

PPS还有Apple开始拒绝非iPhone5优化应用程序的日期,但这与SDK更改无关,更不用说像6到7这样的主要版本更改了:http://thenextweb.com/apple/2013/03/21 /后一岁的-警告-苹果意志不再视为接受,任何-应用-即使用-的UDID-AS-的-MAY-1 /

xcode app-store ios ios7 xcode5

26
推荐指数
0
解决办法
6968
查看次数