【问题标题】:Objective C, iOS, how do I attach a couple of int variables to UIImageView which is part of an IBOutletCollection?Objective C,iOS,如何将几个 int 变量附加到作为 IBOutletCollection 一部分的 UIImageView?
【发布时间】:2011-05-18 13:06:27
【问题描述】:

我需要跟踪一些可以在屏幕上拖动并位于其他图像视图中的图像视图。例如进球中的足球。我想通过为足球、当前目标和目标中看到的时间附加一些额外的属性来做到这一点。

@property (nonatomic, retain) IBOutlet IBOutletCollection(UIImageView) 
    NSArray *multipleFootballs;

我想,我必须创建一个超类。 虽然我不确定最好的方法是什么?

EDIT3:谢谢 nick,但我如何访问实例属性?

@interface FootballImageView : UIImageView {
    int intCurrentGoal;
}
@property (readwrite) int intCurrentGoal;

@implementation FootballImageView
@synthesize intCurrentGoal;

-(id)init {

    self = [super init];
    if(self) {
        // do your initialization here...
    }
    return self; 
}

@end

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
for (id football in multipleFootballs) {

    //if ([[touches anyObject] intCurrentGoal] == 0) {
    //if (football.intCurrentGoal == 0) {

【问题讨论】:

  • 你的属性合成了吗? football.intCurrentGoal 只能在您编写了一个 getter 方法或合成一个方法时使用。 [touches anyObject] 完全不同:在这种情况下,它将返回一个 UITouch 对象。
  • 不要对原始类型使用保留、复制或分配!删除分配。而且您的初始化程序不完整。我会在我的答案中添加一个更简洁的版本......
  • 我在回答中添加了编辑 3 的回复。

标签: objective-c ios uiimageview nsarray


【解决方案1】:

应该很容易:

  • 新建一个继承自UIImageView的子类,我们称之为MyImageView
  • 将您需要的自定义实例变量添加到标题中
  • 在界面生成器(标识选项卡)中选择新的 MyImageView 作为旧 UIImageViews 的类
  • IBOutletCollection(UIImageView)更改为IBOutletCollection(MyImageView)

-

- (id)init 
{
    self = [super init];
    if(self) {
        // do your initialization here...
    }
    return self; 
}

回复编辑 3

您面临的问题是您在 touchesBegan 中使用的匿名类型 (id)。像这样进行检查:

for (FootballImageView *football in multipleFootballs) {
    if(football.intCurrentGoal == 0) {
        football.intCurrentGoal++;
    } 
}

【讨论】:

  • @Jules 通过为您的属性分配一个值。更正了。您通过分配给 intCurrentGoal 来设置一个值。但是我认为这不是您的问题所指的,对吧?
  • @Jules 你可以像我更新的答案显示的那样编写循环,只要你知道multipleFootballs 将只包含FootballImageViews。你看到什么样的警告?
  • @Jules,是的,它是一种类型,它是大 F,应该是 isKindOfClass,但是您可以像更新的答案一样更改循环。
  • @Jules 你能给我们一些你想设置值的代码吗?
  • @Jules 你导入了 FootballImageView 的标题了吗?你的touches实际上是在哪个班级开始的?
【解决方案2】:

通常(也是好的)建议是您应该避免将状态保留在视图对象中。在目标和当前目标中看到的时间等属性应该是您的数据模型的一部分,而不是附加到您的视图中。这有很多很好的理由,但主要归结为两大点:

  1. 将状态与视图混合会使事情变得不必要地复杂。
  2. Cocoa Touch 的设计预期应用将采用 MVC 范例。

作为第一点的示例,考虑当用户从主游戏屏幕切换到更改设置、接听电话等时会发生什么。在我看来,您有三个选择:a) 保留所有即使没有显示视图,您也可以维护应用程序的状态; b) 在释放视图之前从视图中保存状态; c) 防止用户离开游戏。 (a) 和 (c) 似乎都不是好主意,如果您采用 MVC 方法,您将免费获得 (b)。

相反,创建一个可以代表游戏所有方面的数据模型。您可以使用标准类,例如 NSDictionary 和 NSSet,或者您自己设计的类,例如 Football 和 Pitch,或者(很可能)组合使用。然后创建一个游戏控制器来观察相关模型对象的变化并在相应的视图中进行更改。

【讨论】:

  • 哦,我没有意识到这些值不会被保留。我正在寻找一种简单的方法。我有点担心实施您的一些建议会超出我的理解范围。我确实考虑过一种技术含量很低的方法,但这很愚蠢。我发现如果不看例子就很难想象最好的方法,这些例子很难找到。
  • “数据模型”可能听起来令人生畏,但您的模型可以随心所欲地简单化。查看SeismicXMLEarthquake 类——它实际上只是描述地震的值的容器。
  • 我认为您只是使用这个示例,而东的意思是使用 XML。好像有点过分了?
  • 对——忘记 XML 部分。该应用程序的数据模型只是一个地震对象数组。你的可能是一个 Football 对象数组,或者一个包含 Football 和 Goal 对象数组的字典,或者任何对你正在做的事情有意义的东西。
  • 那么您建议我如何将模型项与我的视图控件链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2014-03-21
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多