This question already has answers here:
Access objects of a specific type using for-in loop in Objective C [duplicate]
                                
                                    (2个答案)
                                
                        
                                4年前关闭。
            
                    
因此,我正在构建此iOS应用。每次使用时,请在一个小方块上轻按该方块,以改变颜色。我已经确保定义了所有方法。而且我已经更改了xIndex值的名称,以便可以确保不是崩溃的来源是视图的.xIndex值。但是无论我做什么,我仍然会得到:

'-[UIView xIndex]: unrecognized selector sent to instance 0x7fe06be6ce70'


请注意,以上实例指的是specificSquare的内存地址。有什么猜想吗?战斗了几个小时。

- (void)handleFunViewSquareTap:(UITapGestureRecognizer*)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        // handling code
        CGPoint locationOfTap = [sender locationInView: self.view];
        NSInteger xVIndex = floorf(locationOfTap.x / 40.f);
        NSInteger yIndex = floorf(locationOfTap.y / 40.f);

        // find the view that matches these indexes
        for(FunViewSquare *specificSquare in [self.view subviews])
        {
            if((specificSquare.xIndex == xVIndex) && (specificSquare.yIndex == yIndex))
           {
//                //specificSquare.backgroundColor = [ViewController randomColor];
           }
        }
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];

        CGRect frameRect = self.view.frame;
        NSInteger xIndex, yIndex = 0;
        for( CGFloat yPosition = 0.0; yPosition < frameRect.size.height; yPosition+=40.0f )
        {
            // reset xIndex on every iteration
            xIndex = 0;
            for( CGFloat xPosition = 0.0; xPosition < frameRect.size.width; xPosition+=40.0f )
            {
                FunViewSquare *randomSquare = [[FunViewSquare alloc] initWithFrame: CGRectMake(xPosition, yPosition, 40.f, 40.0f)];

                if(randomSquare)
                {
                    randomSquare.backgroundColor = [ViewController randomColor];
                    randomSquare.xIndex = xIndex;
                    randomSquare.yIndex = yIndex;
                    [self.view addSubview: randomSquare];
                }
                xIndex++;
            }
            yIndex++;
        }

        butGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleFunViewSquareTap:)];
        if(butGestureRecognizer)
        {
            [self.view addGestureRecognizer: butGestureRecognizer];
        }

}


+ (UIColor *)randomColor
{
    UIColor *colorToReturn;

    uint32_t randomNumber = random();
    randomNumber = (randomNumber % 10); // a random number between 0 & 10

    switch(randomNumber)
    {
        case 0 :
            colorToReturn = [UIColor blueColor];
            break;
        case 1 :
            colorToReturn = [UIColor grayColor];
            break;
        case 2 :
            colorToReturn = [UIColor greenColor];
            break;
        case 3 :
            colorToReturn = [UIColor purpleColor];
            break;
        case 4 :
            colorToReturn = [UIColor redColor];
            break;
        case 5 :
            colorToReturn = [UIColor brownColor];
            break;
        case 6 :
            colorToReturn = [UIColor cyanColor];
            break;
        case 7 :
            colorToReturn = [UIColor orangeColor];
            break;
        case 8 :
            colorToReturn = [UIColor magentaColor];
            break;
        case 9 :
            colorToReturn = [UIColor whiteColor];
            break;
        default :
            colorToReturn = [UIColor blackColor];

    }
    return(colorToReturn);
}

@end

最佳答案

问题在于您要遍历self.view中的所有子视图,而并非所有这些视图都是FunViewSquare视图,并且不会全部响应xIndex。因此崩溃。

看来您假设for循环只会在FunViewSquare中挑选出subviews对象-事实并非如此。

您需要在这里进行一些自省-像这样重写代码:

for(FunViewSquare *specificSquare in [self.view subviews]) {
 if ([specificSquare isKindOfClass:[FunViewSquare class]](
  if ((specificSquare.xIndex == xVIndex) && (specificSquare.yIndex == yIndex)){
           //specificSquare.backgroundColor = [ViewController randomColor];
  }
 }
}


这样,您可以检查以确保specificSquare确实是FunViewSquare对象。

关于ios - 无法识别无法识别的选择器错误的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32002419/

10-12 21:28