刚接触Objective-C的.Net开发人员。需要一些评论和建议吗
我已经使用Objective-C创建了我的第一个应用程序之一。作为一个noob,我想做很多事情,但不知道如何在Objective-C中应用。请看一下我从头开始创建的下面的方法,并告诉我你会做些什么来改进它。显然,我已经在2个UILabel上复制了代码,但我想简化一下,我讨厌复制代码,但我不知道最好的方法是什么。我只需要一些建议,帮助我更好地理解在Objective-C中做事情的正确方法 timeText和dateText属于UILabel类型刚接触Objective-C的.Net开发人员。需要一些评论和建议吗,objective-c,iphone-sdk-3.0,Objective C,Iphone Sdk 3.0,我已经使用Objective-C创建了我的第一个应用程序之一。作为一个noob,我想做很多事情,但不知道如何在Objective-C中应用。请看一下我从头开始创建的下面的方法,并告诉我你会做些什么来改进它。显然,我已经在2个UILabel上复制了代码,但我想简化一下,我讨厌复制代码,但我不知道最好的方法是什么。我只需要一些建议,帮助我更好地理解在Objective-C中做事情的正确方法 timeText和dateText属于UILabel类型 - (void)touchesMoved:(NSSe
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if (isRearranging)
{
NSLog(@"touchesMoved");
NSLog(@"touches=%@,event=%@",touches,event);
//TOUCH INFO
UITouch *touch = [[touches allObjects] objectAtIndex:0];
CGPoint currentLocation = [touch locationInView:touch.view];
CGPoint previousLocation = [touch previousLocationInView:touch.view];
//FRAME INFO
float timeHalfWidth = timeText.frame.size.width / 2;
float timeHalfHeight = timeText.frame.size.height / 2;
CGRect timeTextRect = CGRectMake(timeText.center.x - (timeHalfWidth), timeText.cener.y - (timeHalfHeight), timeText.frame.size.width, timeText.frame.size.height);
float dateHalfWidth = dateText.frame.size.width / 2;
float dateHalfHeight = dateText.frame.size.height / 2;
CGRect dateTextRect = CGRectMake(dateText.center.x - (dateHalfWidth), dateText.center.y - (dateHalfHeight), dateText.frame.size.width, dateText.frame.size.height);
//IF TIME TEXT
if(CGRectContainsPoint(timeTextRect,previousLocation))
{
CGPoint item = timeText.center;
CGPoint diff;
diff.x = previousLocation.x - item.x;
diff.y = previousLocation.y - item.y;
CGPoint newLoc;
newLoc.x = currentLocation.x - diff.x;
newLoc.y = currentLocation.y - diff.y;
if (newLoc.x<timeHalfWidth)
newLoc.x = timeHalfWidth;
if (newLoc.y<timeHalfHeight)
newLoc.y = timeHalfHeight;
[timeText setCenter:(newLoc)];
}
//IF DATE TEXT
if(CGRectContainsPoint(dateTextRect,previousLocation))
{
CGPoint item = dateText.center;
CGPoint diff;
diff.x = previousLocation.x - item.x;
diff.y = previousLocation.y - item.y;
CGPoint newLoc;
newLoc.x = currentLocation.x - diff.x;
newLoc.y = currentLocation.y - diff.y;
if (newLoc.x<dateHalfWidth)
newLoc.x = dateHalfWidth;
if (newLoc.y<dateHalfHeight)
newLoc.y = dateHalfHeight;
[dateText setCenter:(newLoc)];
}
}
touchMoved = YES;
}
非常感谢你的帮助 第一步,独立于您所使用的语言,将是遵循-您的大多数代码对于两个标签都是相同的。 那么SDK中已经有了命中测试功能,例如,或:
第一步,独立于您正在使用的语言,是遵循-您的大多数代码对于两个标签都是相同的。 那么SDK中已经有了命中测试功能,例如,或:
我将在评论中回答提问者提出的另一个问题。引述: 如果我想在该数组中使用混合类型呢?i、 e.一对UILabel和一对UIImageView。有没有比较类型或使用泛型的方法?对于对象{if label.type==UILabel[self-relocateLabel:obj];else if label.type==UIImageView[self-relocateImage:obj];}中的NSObject*obj,这是一个糟糕的猜测/示例 正如Georg Fritzsche在那里回答的那样,Objective-C消息传递是动态的。对象在运行时是否支持该消息将被查询,如果支持,它将执行与该消息关联的方法。方法/消息名称为选择器 若您明确地想要找出对象的类,那个么您也可以这样做
if([view isKindOfClass:[UILabel class]])
{
// your code here
}
如果您只想确定目标对象是否响应选择器,即实现一个方法:
if([view respondsToSelector:@selector(relocateView:)])
{
// your code here
}
选择器是从方法名派生出来的,它省略了参数本身,保留冒号,并紧密地追加所有内容。例如,如果您有一个消息发送,即方法调用:[thing moveTowardsObject:door movementType:XYZ_CRAWL],则其选择器将是:moveTowardsObject:movementType:,您可以使用@selector moveTowardsObject:movementType:
在Georg发布的循环中,通常只需检查目标对象是否响应选择器,否则将引发异常,而Objective-C代码很少捕捉异常作为正常代码流的一部分,这与Python开发人员所做的相反。我将在评论中回答asker提出的另一个问题。引述: 如果我想在该数组中使用混合类型呢?i、 e.一对UILabel和一对UIImageView。有没有比较类型或使用泛型的方法?对于对象{if label.type==UILabel[self-relocateLabel:obj];else if label.type==UIImageView[self-relocateImage:obj];}中的NSObject*obj,这是一个糟糕的猜测/示例 正如Georg Fritzsche在那里回答的那样,Objective-C消息传递是动态的。对象在运行时是否支持该消息将被查询,如果支持,它将执行与该消息关联的方法。方法/消息名称为选择器 若您明确地想要找出对象的类,那个么您也可以这样做
if([view isKindOfClass:[UILabel class]])
{
// your code here
}
如果您只想确定目标对象是否响应选择器,即实现一个方法:
if([view respondsToSelector:@selector(relocateView:)])
{
// your code here
}
选择器是从方法名派生出来的,它省略了参数本身,保留冒号,并紧密地追加所有内容。例如,如果您有一个消息发送,即方法调用:[thing moveTowardsObject:door movementType:XYZ_CRAWL],则其选择器将是:moveTowardsObject:movementType:,您可以使用@selector moveTowardsObject:movementType:
在Georg发布的循环中,您通常只需要检查目标对象是否响应选择器,因为否则会引发异常,而Objective-C代码很少捕获异常作为正常代码流的一部分,这与Python开发人员所做的相反。编辑您的帖子,突出显示所有代码,然后单击文本编辑器中的“代码”按钮。第一步,在发布时设置代码的格式。编辑您的文章,突出显示所有代码,然后单击文本编辑器中的“代码”按钮。第一步,在发布时设置代码的格式。DRY是我特别提到复制代码的原因。我想看到有人以正确的方式重写我的副本。你给了我我想要的东西。如果我想在该数组中使用混合类型呢?i、 e.一对UILabel和一对UIImageView。有没有比较类型或使用泛型的方法?这是对象{if label.type==UILabel[self-relocateLabel:obj];else if label.type==UIImageView[self-relocatemage:obj];}@Ricky:Objective-C消息传递是动态的,两个示例都派生了f
rom UIView-只要您只使用UIView中的方法,就可以在视图中创建forUIView*视图和-relocateView:UIView*view.DRY,这就是我特别提到复制代码的原因。我想看到有人以正确的方式重写我的副本。你给了我我想要的东西。如果我想在该数组中使用混合类型呢?i、 e.一对UILabel和一对UIImageView。有没有比较类型或使用泛型的方法?对于对象{if label.type==UILabel[self-relocateLabel:obj];else if label.type==UIImageView[self-relocateImage:obj];}中的NSObject*obj,这是一个糟糕的猜测/示例@Ricky:Objective-C消息传递是动态的,这两个示例都源自UIView,所以只要您只使用UIView中的方法,就可以在视图中创建forUIView*视图和-RemoveView:UIView*视图。