刚接触Objective-C的.Net开发人员。需要一些评论和建议吗

刚接触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

我已经使用Objective-C创建了我的第一个应用程序之一。作为一个noob,我想做很多事情,但不知道如何在Objective-C中应用。请看一下我从头开始创建的下面的方法,并告诉我你会做些什么来改进它。显然,我已经在2个UILabel上复制了代码,但我想简化一下,我讨厌复制代码,但我不知道最好的方法是什么。我只需要一些建议,帮助我更好地理解在Objective-C中做事情的正确方法

timeText和dateText属于UILabel类型

- (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*视图。