0

我正在尝试编写我的第一个 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 中。因此,在 Storyboard 上,我拖出一个自定义视图并设置为 GridOfIconsView,但随后我只看到一个大的白色矩形,我真的希望能够在 Storyboard 中可视化我的应用程序。我知道我可以将用于图标的实际图像文件拖到 Storyboard 上并将它们设置为自定义视图,但那是如何工作的呢?该图像只是自定义视图的背景吗?我可以以编程方式更改它吗?因此,如果激活的图像是绿色方块,而停用的图像是红色的,并且我最初将红色方块拖到情节提要中,我可以访问那个红色方块图像吗?

一个更令人担忧的问题是,我想在一个数据结构中管理所有这些图标,或者作为二维数组(id icons[][])或 NS(Mutable?)Array 的 NS(Mutable?)Arrays。无论哪种方式,我如何初始化数据结构以包含所有这些的链接?网格可能是 8x8 或 10x10,我不可能有 64-100 个@propertys 连接这些图标。我在想明智地组织这个的唯一方法是以编程方式,但是,我怎样才能在 Storyboard 中可视化它?

4

1 回答 1

0

首先,在 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:回调中,查询视图中点击的位置。如果该职位在您的任何观点的框架内,您就会知道是哪一个以及如何处理它。如果没有,你可以忽略它。这个解决方案需要更多的数学运算,但也需要更少的维护和需要连接的手势识别器。我会推荐这个解决方案而不是标记你的观点。

于 2012-08-28T22:18:29.097 回答