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值。但是无论我做什么,我仍然会得到:
请注意,以上实例指的是specificSquare的内存地址。有什么猜想吗?战斗了几个小时。
这样,您可以检查以确保
(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