我正在开发一个包含Mac应用程序和共享代码的iPad应用程序的项目.如何使用条件编译开关从iPhone项目中排除特定于Mac的代码,反之亦然?我注意到,TARGET_OS_IPHONE和TARGET_OS_MAC都为1,所以他们都总是如此.是否有另一个我可以使用的开关只会在编译特定目标时返回true?
在大多数情况下,我通过移动#include <UIKit/UIKit.h>和#include <Cocoa/Cocoa.h>进入两个项目的预编译头来获得合作的文件.我正在共享模型和一些实用程序代码,用于从RSS提要和Evernote获取数据.
特别是,该[NSData dataWithContentsOfURL:options:error:]函数对选项参数iOS 3.2及更早版本和Mac OS 10.5采用不同的常量,而且比iOS 4和Mac OS 10.6更早.我正在使用的条件是:
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2)) || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5))
这似乎有效,但我想确保这是防弹的.我的理解是,如果Mac版本设置为10.6,但iOS版本设置为3.2,即使它正在编译iOS 3.2,它仍然会使用新的常量,这似乎是不正确的.
在此先感谢您的帮助!
我正在开发一个应用程序,我们正在尝试针对临时环境以及生产环境进行一些测试.当然,我已经创建了"Stage"和"Prod"构建配置以在两者之间切换,但我的客户希望将两者并排安装,以便他们可以轻松地在两个环境之间切换.到目前为止,我一直在使用不同的包标识符和包显示名称维护我的代码分支,因此可以并排安装和测试它们.不过,我开始怀疑是否有更简单的方法可以做到这一点.有没有办法我可以定义自定义构建设置,根据构建配置给它一个值,然后将它附加到包标识符的末尾?
就像是...
BUNDLE_SUFFIX
TEST
STAGE
PROD ".PROD"
Run Code Online (Sandbox Code Playgroud)
...然后将我的Bundle Identifier设置为com.blah.blah$(BUNDLE_SUFFIX).然后使用PROD配置的所有构建将自动获得新的bundle id,并且我不必一直同步分支.这种事情甚至可能吗?
我为这个冗长的问题提前道歉.我遇到了自签名SSL证书的问题,我想记录到目前为止我尝试过的所有内容.
我正在开发一个与REST服务通信的应用程序.测试服务器使用自签名的ssl证书,我可以在我的计算机上安装该证书.这是一个需要密码才能安装的.p12文件.如果未安装此证书,则对服务器的所有请求都将返回403.
.p12在Keychain中安装三个项目,一个"根证书颁发机构",一个由"根证书颁发机构"颁发的"测试用户"证书,以及一个与"测试用户"证书相关联的私钥.
我通过给自己发送.p12文件,在iPad上安装了这个证书.我点击附件,输入密码,现在我可以在Safari中访问该网站.不幸的是,由于应用程序沙盒,这还不足以让我的应用程序与REST服务进行通信.
我正在使用ASIHTTPRequest来完成与我的应用程序中的REST服务的所有通信.每个请求都是ASIHTTPRequest的子类.我发现我必须做的第一件事就是调用,[self setValidatesSecureCertificate:NO];以便它甚至可以尝试SSL连接到服务器.如果这就是我所做的,我会从服务中获得403错误代码.
现在我似乎无法弄清楚如何获得使用证书的请求.我已经尝试将这三个项目导出为单独的.cer文件,包括它们在项目中,并使用以下代码将它们添加到请求中:
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];
Run Code Online (Sandbox Code Playgroud)
虽然使用这种方法代码执行没有问题,但我仍然得到403错误.
我甚至尝试在我的应用程序中包含.p12文件并使用相同的代码导入它.这会失败,因为SecCertificateCreateWithData返回nil.
我承认我真的不知道我在这里做什么.这一切都在我头上,任何人都可以给我的任何帮助将不胜感激.
打电话通常是个好主意-[NSRunLoop runUntilDate:]吗?它似乎没有任何问题,但它让我很紧张,告诉运行循环从运行循环内运行.
更多信息:
我现在有一个从REST服务获取数据的项目.需要获得的一个关键信息是具有有效数据的日期范围.它是只需要一次得到的数据非常小一点,所以我决定来处理它的最好办法是让物业下载数据,如果局部变量nil.我正在使用ASIHTTPRequest和一个ASINetworkQueue,所以默认情况下一切都是异步的,为了使这个工作,这个属性在下载和处理数据之前不能返回.这是我的代码的大纲,变量的名称已被更改以保护无辜:
__block BOOL isWorking = YES;
__block ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:/*actual URL*/] autorelease];
[request setCompletionBlock:^{
// set local variable
isWorking = NO;
}];
[request setFailedBlock:^{
// show alert to user
isWorking = NO;
}];
[queue addOperation:request];
while (isWorking) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
Run Code Online (Sandbox Code Playgroud)
再次,这似乎工作正常.使用这种方法有任何潜在的问题吗?
我有一个项目,在Mac应用程序和iPad应用程序之间共享一些文件.因此,我将每个文件的Info.plist和Prefix.pch文件分别移动到Mac和iPad的子文件夹中.对于模拟器和设备,我可以在Debug配置中构建没有问题的iPad应用程序.我在构建结果中收到以下消息:
处理iPad/Fogozine-Info.plist
预编译iPad/Fogozine_Prefix.pch
旁边有一个绿色的大号复选标记.一切都好.
但是,当我为Release构建时,我得到以下内容:
处理Fogozine-Info.plist
无法打开文件"Fogozine-Info.plist",因为没有此类文件.
预编译Fogozine_Prefix.pch
命令/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2失败,退出代码为1
他们旁边有一个红色的大感叹号.是否有一些我缺少的构建设置特定于发布版本?我可以在Build设置中看到Info.plist条目,但无论是否将其留空,将其设置为iPad,或将其设置为iPad/Fogozine-Info.plist,最终结果都是相同的,适用于所有构建配置.我没有看到任何与Prefix.pch文件相关的内容.这似乎是Xcode中的一个错误.任何帮助将不胜感激.
我正在尝试将单元测试添加到Xcode 4中的现有通用应用程序.我已经按照教程进行了测试,当模拟器中的逻辑测试正常运行时,当我尝试在设备上进行测试时,我得到一个对话框,说"逻辑测试"不支持iOS设备.您可以在模拟器上运行逻辑测试." 但是,我注意到当你在Xcode 4中创建一个新项目并检查Include Unit Tests框时,它实际上会在设备上安装并运行测试.我错过了某个允许我在现有项目中启用该选项的选项吗?
我正在开发一个有很多UITableViews的应用程序,我试图给它们带纹理的背景颜色.我需要使用Grouped样式,因为当用户滚动时,我不希望节标题在文本字段上浮动.
我遇到的问题是,当我使用Grouped样式时,背景纹理不会随表格滚动; 它在桌子上方滚动时保持原位.我觉得这有点奇怪,我宁愿把背景滚动到桌子上,就像它在平原风格中那样.不幸的是,因为我不能将标题视图浮动在所有内容之上,所以这似乎不是一个选项.
有没有人能够做到这一点?
这是一些相关的代码:
- (void)loadView {
[super loadView];
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"texturedPattern.png"]];
// this prevents the cells from replicating the background texture
self.tableView.backgroundView = [[UIView alloc] initWithFrame:self.view.bounds];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// disable the default grouped border since we're doing it manually with the textField
cell.backgroundView = nil;
cell.backgroundColor = [UIColor clearColor];
}
Run Code Online (Sandbox Code Playgroud)
我的表视图目前看起来像这样:

UPDATE
正如Amit Vyawahare建议的那样,我尝试将背景纹理应用于标题和每个单元格的背景.当你看到它时,有两个问题更加明显,但我会尽我所能.

在你看到黑色的任何地方,tableView的背景纹理都是可见的,它不会随tableView滚动.Grouped tableView样式在每个单元格的任一侧插入5像素边框,无法更改.此外,在Staff …
我正在开发一个需要三个字母(ISO 639-2)语言代码才能访问REST服务的项目.我希望使用当前的语言设置[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode].不幸的是,这种方法更喜欢返回两个字母(ISO 639-1)语言代码.有没有办法可以强制NSLocale返回更新的代码,还是有另一种方法可以用来将双字母语言代码转换为三字母语言代码?
我一直在看斯坦福CS193P讲座,我一直在研究作业计算器.我很轻松地完成了第一项任务,现在我正在努力为任务做额外的工作.然而,我被困在一个额外的信用问题上:
实现一个用户界面,用于选择sin()或cos()的操作数是否被视为弧度或度数.当你在C库中调用sin(x)时,x被假定为弧度(即0到2π围绕圆圈一次),但是用户可能想要输入180并按下sin按钮并得到0而不是-0.8012 (这是180弧度的正弦).您可以使用UIButton并在每次按下UIButton时切换titleLabel的文本,但更好的方法是查看是否可以通过阅读文档来了解如何使用UISwitch(如果你敢!).
我实现了一个UISwitch并将其作为IBOutlet连接起来.当我执行'操作'时,我检查开关是打开还是关闭,并将其传递给我的模型以及要执行的操作.在我的罪和案件中,我做了以下事情:
else if ([operation isEqual:@"sin"])
{
if (radians) {
operand = sin(operand);
}
else {
operand = sin(operand) * (180 / M_PI);
}
}
// similar for cos
Run Code Online (Sandbox Code Playgroud)
如果radians(这是BOOL:YES =弧度,没有=度),那么我通常执行操作; 如果用户将开关置于'度',我想以度为单位返回值,因为赋值状态:用户可能想要输入180并按下sin按钮并获得0而不是-0.8012(这是180的正弦值)弧度).
但是,此代码并不完全有效.当我将开关置于度数时,sin 180它会返回更多或更少的值-45.那里出了点问题; 而且我不确定是什么.我已经查找了如何进行转换,我认为我做得对,但显然没有.
我意识到这可能更适合math.stackexchange,但由于我想发布一些代码,我把它放在这里.有人可以就实施此方法的最佳方式提供一些建议吗?我已经有一段时间了,因为我甚至使用过cos或sin,弧度和度数.
谢谢!
我有一个棘手的内存管理问题,我试图确保我理解块.我正在开发一个可以播放视频的应用程序,但需要检查用户是否真的可以先播放它.有几个步骤需要验证,其中一些需要用户交互,所以我有一大堆代码看起来像这样:
MyVideoPlayer *videoPlayer = [[[MyVideoPlayer alloc] init] autorelease];
[videoPlayer canPlayAsset:(MyVideoAsset *)asset completionBlock:^(BOOL isAssetPlayable) {
if (isAssetPlayable) {
[videoPlayer playAsset:asset];
[self presentModalViewController:videoPlayer animated:YES];
}
}];
Run Code Online (Sandbox Code Playgroud)
此方法可以立即返回,也可能需要一些用户输入和一些网络调用,因此实际呈现播放器的块.我注意到一些奇怪的行为,我发现视频播放器被泄露了.这就是我的想法:
videoPlayer会被自动释放.videoPlayer由块保留.videoPlayer或不呈现.videoPlayer.videoPlayer被dealloc'd(立即,如果它不呈现,或当模态视图驳回).相反,发生的事情是这样的:
videoPlayer会被自动释放.videoPlayer由块保留.videoPlayer或不呈现.现在,我注意到如果我按如下方式修改块,我能够得到我期望的行为:
MyVideoPlayer *videoPlayer = [[[MyVideoPlayer alloc] init] autorelease];
[videoPlayer canPlayAsset:(MyVideoAsset *)asset completionBlock:^(BOOL isAssetPlayable) {
if (isAssetPlayable) {
[videoPlayer playAsset:asset];
[self presentModalViewController:videoPlayer animated:YES];
}
[videoPlayer autorelease];
}];
Run Code Online (Sandbox Code Playgroud)
但我真的不想在不知道自己在做什么的情况下添加它.
我的理解是,这不是 …
从后台线程将数据写入 NSPasteboard 对象是否安全?我似乎无法在任何地方找到明确的答案。我认为假设数据将在拖动开始之前写入粘贴板。
背景:
我有一个从 Evernote 获取数据的应用程序。当应用程序第一次加载时,它获取每个笔记的元数据,而不是笔记内容。然后在大纲视图中列出笔记存根。当用户开始拖动笔记时,笔记将传递到后台线程,该线程处理从 Evernote 获取笔记内容。在获取数据之前阻塞主线程会导致显着延迟和糟糕的用户体验,所以我有 [outlineView:writeItems:toPasteboard:]函数返回YES而后台线程处理数据并调用主线程将数据写入粘贴板对象。如果笔记内容在用户将笔记放在某个地方之前被传输,那么一切都会完美无缺。如果用户在处理数据之前将笔记放在某个地方......好吧,一切都会永远阻塞。仅让后台线程将数据写入粘贴板是否安全?
ios ×7
xcode ×3
ipad ×2
iphone ×2
cocoa ×1
localization ×1
macos ×1
nsrunloop ×1
nsurlrequest ×1
objective-c ×1
ssl ×1
trigonometry ×1
uitableview ×1
unit-testing ×1
xcode4 ×1