我正在玩一个简单的OCUnit测试用于iPhone应用程序,并且只是想断言应用程序委托是我期望它的类的实例.我没想到这个测试非常有用,但结果却揭示了我对Objective C的误解.
我首先得到了代表的参考.然后我记录回来的类名.在我的例子中,输出正确地说"app delegate的类名是CalculatorAppDelegate".
但是,下一行的断言失败了,我不明白为什么.
- (void)testAppDelegate
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}
Run Code Online (Sandbox Code Playgroud)
什么情况可能导致NSStringFromClass()返回正确的类名,而isKindOfClass返回false?
2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class …
Run Code Online (Sandbox Code Playgroud) 如果这解决了问题,这里是原始的Objective-C代码.
int x = (arc4random()%(int)(self.gameView.bounds.size.width*5)) - (int)self.gameView.bounds.size.width*2;
int y = self.gameView.bounds.size.height;
drop.center = CGPointMake(x, -y);
Run Code Online (Sandbox Code Playgroud)
我开始使用这段代码.第2行和第3行都很好,我稍后会介绍它们.
let x = CGFloat(arc4random_uniform(UInt32(self.gameView.bounds.size.width * 5))) - self.gameView.bounds.size.width * 2
let y = self.gameView.bounds.size.height
dropView.center = CGPointMake(x, -y)
Run Code Online (Sandbox Code Playgroud)
在Xcode 6 beta 3中,有必要将arc4random_uniform UInt32结果转换为CGFloat,以使减号和乘法起作用.这不再起作用,编译器显示错误:
'CGFloat'不能转换为'UInt8'
发行说明指出:
"CGFloat现在是一个独特的浮点类型,它包含32位体系结构上的Float或64位体系结构上的Double.它提供了Float和Double的所有相同的比较和算术运算,可以使用数字文字创建使用CGFloat可以将代码与代码完全隔离,对于32位是好的,但在构建64位时会失败,反之亦然.(17224725)
我只是在做类型的错误吗?我甚至不知道如何更好地描述这个问题,向Apple提交一个错误报告给beta 4.几乎我所拥有的每一个Swift项目都会受到这个问题的影响.所以我是寻找一些理智.
我试图设计一个帮助方法,它将检索UIManagedDocument,然后打开并返回它,以便我可以从我的应用程序中的几个地方访问相同的UIManagedDocument.
由于我对块不太熟悉,因此我遇到了异步性问题.理想情况下,事件的顺序是这样的:
我可以通过某种方式传递原始块吗?
到目前为止,这是我的代码.任何想法都非常感谢,谢谢.
// This is a dictionary where the keys are "Vacations" and the objects are URLs to UIManagedDocuments
static NSMutableDictionary *managedDocumentDictionary = nil;
// This typedef has been defined in .h file:
// typedef void (^completion_block_t)(UIManagedDocument *vacation);
// The idea is that this class method will run the block when its UIManagedObject has opened
@implementation MyVacationsHelper
+ (void)openVacation:(NSString *)vacationName usingBlock:(completion_block_t)completionBlock
{
// Try to retrieve the relevant UIManagedDocument from managedDocumentDictionary
UIManagedDocument *doc …
Run Code Online (Sandbox Code Playgroud) 我从课程网站下载了Smasthag演示应用程序.项目构建正常(在Twitter,TwitterRequest等类的小变化之后,因为我使用最新的Xcode 7b4)并且在模拟器上工作正常(我还必须添加NSAppTransportSecurity
密钥info.plist
),但不在设备上 - 它不会获取推文.我在带有iOS 9 Public Beta的iPhone 6和带有iOS 8.4的iPad 2上进行了测试.此外,当app在模拟器中运行并且我更改了hashtag以进行搜索时,整个tableView会重新加载新的推文,但在控制台中我得到了这个:
2015-07-23 03:24:15.560 Smashtag[25991:4344251] _BSMachError: (os/kern) invalid capability (20)
2015-07-23 03:24:15.560 Smashtag[25991:4344251] _BSMachError: (os/kern) invalid name (15)
Run Code Online (Sandbox Code Playgroud)
应用仍然运行正常,但这个错误让我感到困扰.我对谷歌中的这个_BSMachError一无所知(只有一条孤独的印尼语推文).我不知道为什么app不能在设备上获取推文.
我正在打牌.我希望卡片背面显示图像,卡片前端显示卡片内容.我已经将图像显示在背面,但我无法弄清楚如何在选中时将其清除.(所有运行 - 这个代码 - 当它选择的代码正在运行,所以我知道这不是一个不实际改变状态的问题.)这是我的代码:
-(void)updateUI {
for (UIButton *cardButton in self.cardButtons) {
Card *card = [self.game cardAtIndex:[self.cardButtons indexOfObject:cardButton]];
[cardButton setTitle:card.contents forState:UIControlStateSelected];
[cardButton setTitle:card.contents forState:UIControlStateSelected | UIControlStateDisabled];
[cardButton setImage:[UIImage imageNamed:@"cardback.png"] forState:UIControlStateNormal];
//I've tried various permutations of the following three lines, but the image never disappears.
[cardButton setImage:nil forState:UIControlStateSelected];
[cardButton setImage:nil forState:UIControlStateSelected | UIControlStateHighlighted];
[cardButton setImage:nil forState:UIControlStateNormal];
cardButton.selected = card.faceUp;
cardButton.alpha=(card.unplayable ? 0.3:1.0);
[self.scoreLabel setText:[NSString stringWithFormat:@"Score: %d",self.game.score]];
}
}
Run Code Online (Sandbox Code Playgroud)
关于我做错了什么的任何想法?
我似乎无法让文本实际跨越多行.高度看起来正确.我错过了什么?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"StatusCell"] autorelease];
CGRect frame = cell.contentView.bounds;
UILabel *myLabel = [[UILabel alloc] initWithFrame:frame];
myLabel.text = [[person.updates objectAtIndex:indexPath.row] valueForKey:@"text"];
[cell.contentView addSubview:myLabel];
[myLabel release];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *text = [[person.updates objectAtIndex:indexPath.row] valueForKey:@"text"];
UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]];
CGSize withinSize = CGSizeMake(tableView.frame.size.width, 1000);
CGSize size = [text sizeWithFont:font constrainedToSize:withinSize lineBreakMode:UILineBreakModeWordWrap];
return size.height + 20;
}
Run Code Online (Sandbox Code Playgroud)
另外,我错过了哪些标签看起来比表格单元格更长? 替代文字http://i31.tinypic.com/15chnjd.gif
我从一个单独的Stack OverFlow帖子下载文件,并将文件夹拖到我的项目中(作为一个组.)依赖性得到解决,它显示依赖于文件的代码没有错误,但是当我尝试编译时,我得到了这个错误:
<unknown>:0: error: unexpected input file: /.../xyz.Swift
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
它可能没什么,但是项目导航器中的文件本身显示为空白图标(虽然我的项目的其他文件具有快速的红色spalsh图标),尽管在属性检查器中作为快速文件签入.
我添加和删除多组文件时偶然发现了几次,我检查了本地目录,似乎没有任何故障......是否有其他东西可能搞乱这个?
谢谢你的建议!
我最近开始在iTunes U上关注斯坦福大学的iPhone开发在线课程.
我正在尝试为前几个讲座做家庭作业.我跟着我构建了一个基本计算器的演练,但现在我正在尝试第一个任务,我似乎无法解决它.这是一个:
您的计算器已经使用浮点数(例如,如果按3/4 =它将正确显示结果值0.75),但是,用户无法输入浮点数.补救这个.仅允许输入合法的浮点数(例如,"192.168.0.1"不是合法的浮点数).
首先,我不确定浮点是否算作digitPressed
或operationPressed
.我甚至尝试过一种新方法,floatingPointPressed
但这种方法并没有真正解决.有人可以提供这方面的指示吗?
当我看到它作为digitPressed时,我尝试过这样的事情:
if (hasFloatingPoint) {
NSRange range = [[display text] rangeOfString:@"."];
if (range.location == NSNotFound)
{
[display setText:[[display text] stringByAppendingFormat:digit]];
hasFloatingPoint = YES;
}
}
else {
[display setText:[[display text] stringByAppendingFormat:digit]];
}
Run Code Online (Sandbox Code Playgroud)
但我想,我在这里错过了关键概念.
我已经尝试了另一种解决方案,遗憾的是,我已经撤消了所以我无法提供代码,但发生的事情是这样的:我可以按一个数字,5
然后说一个浮动点,3
所以我最终会结束5.3
.然后我设法'禁用'输入剩余部分的浮点数.但我想我对它有点过于严格:例如,我不能放入5.3.2
但是在按下操作按钮(+
等)之后,它仍然不会让我按下浮点按钮.我想我应该重置我用过的bool?
我不是在寻找一个完全写出来的解决方案,但有人可以如此善意地提供一些关于如何解决这个问题的基本建议吗?在不实际提供代码解决方案的情况下,对我应该做什么和思考的一些逐步概述.
提前致谢.
我正在尝试跟随斯坦福CS193p iOS编程讲座.其中一个名为"Happiness"的演示程序创建了两个UIViewControllers,一个"PsychViewController"和一个"HappinessViewController".它使用目标操作方法从PsychViewController切换到HappinessViewController.
以下代码不断抛出此异常:" - [UIViewController setHappiness:]:无法识别的选择器发送到实例"
这是有问题的代码:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ShowDiagnosis"]) {
[segue.destinationViewController setHappiness:7];
}
}
Run Code Online (Sandbox Code Playgroud)
我搜索过这个网站和其他人,并且通常在出现此错误时,这是因为通用的UIViewController尚未正确设置为程序中使用的特定视图控制器对象,在本例中为"HappinessViewController".但我已经使用IB中的身份检查器将通用UIViewController设置为HappinessViewController,我仍然得到异常.我正在撕扯我的头发,如果有人可以提供帮助,我将非常感激.
我注意到在斯坦福CS193p课程的计算器演示中,IBOutlet连接被从标签拖到头文件.但是,IBAction连接直接在.m文件中创建.我尝试阅读文档并在Google上搜索但无法找到原因.
我认为IBAction digitPressed方法也应该在头文件中声明(它不应该是接口的一部分吗?).
我显然对Objective C很新(主要是在Java中工作),所以我确信我遗漏了一些基本的东西.
有人可以解释一下吗?
cs193p ×10
objective-c ×6
ios ×5
iphone ×4
swift ×3
xcode ×2
block ×1
cocoa-touch ×1
ios6 ×1
ocunit ×1
segue ×1
uibutton ×1
uiimage ×1
uitableview ×1