Objective c 绕过UIView子类化和在故事板中使用图片

Objective c 绕过UIView子类化和在故事板中使用图片,objective-c,arrays,uiimageview,storyboard,subclass,Objective C,Arrays,Uiimageview,Storyboard,Subclass,我正试图编写我的第一个iPhone应用程序,我陷入了一种设计斗争。我想做的是有一个图标网格,当你触摸一个图标时,上面和左边的所有图标都会“激活”,下面和右边的所有图标都会“停用”。如果图标被激活,它会显示一张图片,如果没有激活,它会显示另一张图片 我遇到的问题是,我想为每个图标分配一个手势识别器,当点击该图标时,它需要调用一个函数来更新我的图标网格。但为了正确更新,函数需要将图像在网格中的位置作为参数传递,并且无法将参数作为手势识别器的一部分调用函数 因此,我真正需要做的就是扩展UIImageV

我正试图编写我的第一个iPhone应用程序,我陷入了一种设计斗争。我想做的是有一个图标网格,当你触摸一个图标时,上面和左边的所有图标都会“激活”,下面和右边的所有图标都会“停用”。如果图标被激活,它会显示一张图片,如果没有激活,它会显示另一张图片

我遇到的问题是,我想为每个图标分配一个手势识别器,当点击该图标时,它需要调用一个函数来更新我的图标网格。但为了正确更新,函数需要将图像在网格中的位置作为参数传递,并且无法将参数作为手势识别器的一部分调用函数

因此,我真正需要做的就是扩展UIImageView,以容纳两个额外的整数和它所包含的网格,然后我可以得到以下代码:

imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapgr = [[UITapGestureRecognizer alloc] initWithTarget:
    self action:@selector(handleTap)];
[imageView addGestureRecognizer:tapgr];
:
:
- (void)handleTap
{
  [self.grid updateTableFromRow:self.row andCol:self.col
}
所以我想这是一种方法,但是我被告知我不应该扩展Objective-C中的类,我应该从头开始构建它们。在这种情况下,我只需要创建一个包含所有属性和/或实例变量的自定义视图,然后用UIImageView填充这个自定义视图

这基本上是好的,除了构建我的故事板。我将管理和创建此图标表的所有代码(以编程方式)放在另一个自定义视图GridOfIconsView中。因此,在故事板上,我拖出一个自定义视图,设置为GridOfIconsView,但随后我只看到一个大的白色矩形,我真的希望能够在故事板中可视化我的应用程序。我知道我可以把我用于图标的实际图像文件拖到故事板上,并将它们设置为自定义视图,但这是如何工作的呢?该图像只是自定义视图的背景吗?我可以通过编程方式更改它吗?因此,如果激活的图像是一个绿色的方块,而停用的图像是一个红色的方块,并且我最初将红色方块拖到故事板上,我可以访问该红色方块图像吗


还有一个更值得关注的问题是,我想在一个数据结构中管理所有这些图标,或者作为二维数组(id icons[][]),或者作为NS(可变?)数组的NS(可变?)数组。无论如何,我如何初始化数据结构以包含指向所有这些的链接?网格可能是8x8或10x10,我不可能让64-100@property连接这些图标。我在想,合理地组织这一切的唯一方法是通过编程,但是,我怎么能在故事板中可视化呢?

首先,在Objective-C中扩展类是完全可以的,而且一直都是这样
UIView
UIViewController
UIComponent
等都是专门为子类化和扩展而设计的

但是,有两种方法比扩展类简单得多。首先,您可以像以前一样使用网格,其中每个视图都连接了一个手势识别器,该识别器可以调用视图控制器上的方法。然后,您可以在每个视图上设置一个标记(甚至只使用视图的框架进行标识),并从回调方法读取该标记(手势识别器被传递回回调方法)。例如,假设您有一个由4x4个视图组成的网格,您只需从左上角开始对它们进行编号,将每列向右推进,然后将每行从0推进到11,您就可以轻松地识别视图:

// The system automatically passes the gesture recognizer as the only parameter
- (void)handleTap:(UIGestureRecognizer)gestureRecognizer
{
  NSInteger viewNumber = [[gestureRecognizer view] tag];
  // do something with this view
}
另一种方法是在父视图上使用一个手势识别器,然后在
-handleTap:
回调中查询点击在视图中的位置。如果位置在您的任何视图的框架内,您将知道使用哪个视图以及如何处理它。如果不是,你可以忽略它。这个解决方案需要稍微多一些数学知识,但也需要更少的维护和更少的需要连接的手势识别器。我建议您使用此解决方案,而不是标记您的视图