我想在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
您在每个应用程序的开发中都会遇到某种情况,您在模拟器中看到的内容与您认为应该发生的内容不匹配.大多数情况下这些是人为错误 - 或者至少它们在我的大多数情况下都是;-) - 但有时Xcode只是"失去了轨道",或者看起来如此.我了解到Clean(Shift + Cmd + K)和Clean Build Folder…(Option + Shift + Command + K)菜单选项可以显示错误或Xcode之间的差异.
我的问题是:
什么是
Clean命令做还是不做,留下一个理由Clean Build Folder…存在吗?我何时应该选择另一个,为什么不总是清理整个文件夹?
我喜欢在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的人肯定知道他们在做什么.
介绍
我的iOS项目附带一个Core Data持久存储,重量约为160MB,采用SQLite格式.那里有大量的分组信息,用户应该可以在其中标记收藏.为此,我需要(至少部分)数据库具有写入功能.但当然,应用程序包中的持久存储是按设计只读的.
如果您希望商店具有读写功能,则应将其复制到例如应用程序的文档文件夹中.我不想这样做,因为那时应用程序将是两倍大小,而该数据库的主要部分仍然是只读的.那将浪费资源.
NSPersistentStoreCoordinator的多个持久存储
这就是为什么我想到使用两个持久存储.第一个是捆绑中的大一个,第二个可能是文档文件夹中的一个小的,存储与大商店有关系的特殊"最喜欢"实体.
我知道在这方面有可能做到,但我找不到具体细节.如果您还有多个对象模型,是否应该只使用多个商店?一个对象模型可以在两个持久存储上"分布"吗?浏览核心数据编程文档时,我找不到任何关于如何设置它的真正参考.Marcus Zarra的书似乎也没有深入研究这个主题:
可以向NSPersistentStoreCoordinator添加多个NSPersistentStore,这在处理拆分为多个文件的数据时非常有用.但是,在我们的例子中,我们只有一个文件.(Marcus Zarra:"核心数据 - Apple在Mac OS X上保存数据的API"第71页)
问题
谁可以告诉我,我在想什么是可能的Core Data和多个持久存储?你能提供一些关于如何实现这一目标的提示吗?处理该主题的在线/离线资源也非常受欢迎.
我当前项目的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 关闭.这是一个截图.底部单元看起来应该并且未被选中.顶部单元格被选中,但它应该显示黑色和灰色的矩形区域,但它们已经消失了!

谁知道这里发生了什么,更重要的是:我怎么能纠正这个?
我即将推出的应用的一些测试用户报告说,联系人列表包含大量重复记录.我正在使用结果ABAddressBookCopyArrayOfAllPeople作为我自定义的联系人表视图的数据源,这让我感到困惑,结果与iPhone的"联系人"应用程序不同.
当仔细查看"联系人"应用程序时,重复项似乎来自具有"链接卡"的条目.下面的屏幕截图有点混淆,但正如你在我最右边的应用程序中看到的那样,"Celine"显示两次,而在左边的Contacts应用程序中只有一个"Celine".如果您单击该单个联系人的行,您将获得一张带有两个"链接卡"的"统一信息"卡(如中心所示,我没有使用Celine的联系方式,因为它们不适用于一个屏幕截图):

围绕"联卡"的问题,有相当一几个主题上苹果的论坛上为最终用户,但除了一个事实,即许多点到404支持页面,我不能真实地去周围固定了我所有的应用程序的用户的地址簿.我更愿意优雅地处理它而不会打扰用户.更糟糕的是,似乎我不是唯一一个有这个问题的人,因为WhatsApp显示的是包含重复联系人的相同列表.
为了清楚重复联系人的起源,我不是存储,缓存或以其他方式试图聪明地了解数组ABAddressBookCopyArrayOfAllPeople返回.因此,重复记录直接来自API调用.
有谁知道如何处理或检测这些链接卡,防止重复记录显示?Apple的联系人应用程序可以做到,我们其他人也可以这样做吗?
更新:我写了一个库并把它放在Cocoapods上以解决手头的问题.请参阅下面的答案
透明度是邪恶的,在iOS设备上甚至比在更重的机器上更加邪恶.因此,我认为首先使用view removeFromSuperView,如果不适用view.hidden=YES,作为最后的手段view.alpha=0.但实际上我不知道幕后发生了什么.是否存在差异,尤其是后两者之间?
我有一个UIView animateWithDuration:animations:completion:场景,如果你在完成块中放入hidden = YES,它将隐藏而不让动画块完成.因此我不得不求助于alpha = 0.
一个人对另一个人的惩罚是什么?干杯,EP.
这个问题是关于UINavigationController中的iOS设备旋转和多个受控视图.有些观点应该限制为纵向,有些观点应该自由旋转.如果您尝试使用三个视图创建最简单的设置,您会注意到自动旋转行为有一些非常令人讨厌的怪癖.然而,这个场景非常简单,所以我想我要么没有正确地进行自动旋转实施,要么就是忘了什么.
我有一个非常基本的演示应用程序,显示了怪异,我制作了一个视频显示它在行动.
设置非常基本:调用三个视图控制器FirstViewController,SecondViewController并且ThirdViewController所有扩展AbstractViewController显示带有类名称的标签,并且shouldAutorotateToInterfaceOrientation:当设备处于纵向时返回YES .SecondViewController重写此方法以允许所有旋转.所有三个具体类都添加了一些彩色方块,以便能够通过将控制器推入/关闭来在视图之间导航UINavigationController.到目前为止,我想说的是一个非常简单的场景.
如果您以纵向或横向方向握住设备,这是我不仅希望实现的结果,而且还期望.在第一张图片中,您会看到所有视图都是"直立",而在第二张图片中,您会看到只有第二个视图控制器反转设备的方向.要清楚,应该可以从横向模式的第二个视图导航到第三个视图,但因为第三个视图仅支持纵向方向,所以它应该只能以纵向显示.查看结果是否正常的最简单方法是查看载体条的位置.

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

我的问题是双重的:
干杯,EP.
编辑:作为奖励之前的最后一招,我完全重写了这个问题,使其更短,更清晰,并希望更有吸引力给出答案.
cocoa-touch objective-c uiviewcontroller uinavigationcontroller device-orientation
方案
我有一种情况,其中一个被调用的基类AbstractRequest具有id <AbstractRequestDelegate>在头文件中声明的类型的委托属性:
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
抽象代表协议包含一些必要方法,并且与字"抽象"所指出的,无论是AbstractRequest与AbstractRequestDelegate旨在是子类/扩展.
其中一个例子是子类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这项工作中出现的所有类和协议名称都是虚构的.任何与真实类和协议名称,开源或专利的相似之处纯属巧合.
更新
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集.

我假设苹果公司将在推出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 /
objective-c ×8
cocoa-touch ×5
ios ×3
xcode ×3
subclassing ×2
xcode4 ×2
abrecord ×1
app-store ×1
categories ×1
core-data ×1
duplicates ×1
ios7 ×1
overriding ×1
properties ×1
selector ×1
synthesis ×1
transparency ×1
uitableview ×1
xcode5 ×1