【问题标题】:Store References to Variable in NSMutableArray在 NSMutableArray 中存储对变量的引用
【发布时间】:2009-08-26 22:12:49
【问题描述】:

我正在寻找一种方法来在 NSMutableArray 中存储对变量的引用。由于将根据用户选择的内容动态创建变量,因此我希望能够简单地对该数组进行排序并获取对这些创建变量的引用。万一这很重要,我正在创建一个 iPhone 项目。但是,当我尝试使用以下代码执行此操作时:

for (int a = 0; a < 10; a++)
{
UIView *tempView;
[listingOfViews addObject:tempView];
}

for (int a = 0; a < [listingOfViews count]; a++)
{
[listingOfViews objectAtIndex:a] = defaultViewStructure;
}

它给了我这个错误:“错误:需要左值作为赋值的左操作数”

有什么想法吗?

编辑:另外,我收到此错误:“错误:请求成员 'size' 不是结构或联合”

当我尝试这样做时

for (int a = 0; a < [listingOfViews count]; a++)
{
[listingOfViews objectAtIndex:a].size.height = ...
}

【问题讨论】:

    标签: cocoa-touch uiview loops nsmutablearray


    【解决方案1】:

    关于你的第二个问题:

    for (int a = 0; a < [listingOfViews count]; a++)
    {
        [listingOfViews objectAtIndex:a].size.height = ...
    }
    

    这里有一个误解(一个 UIView 没有 -size,它有一个包含大小的 -frame),再加上一些实际上有点棘手的东西,因为他们在 Obj-C 中添加了非常混乱的点表示法2 以及当您使用结构时对象模型的不幸故障。你做你想做的事情的方式是:

    UIView *view = [listingOfViews objectAtIndex:a];
    NSRect frame = [view frame];
    frame.size.height = ...
    [view setFrame:frame];
    

    有一些方法可以稍微压缩行数,但您确实需要获取一个 NSRect 结构,修改它,然后将其设置回来。在大多数视图中,您不能一次调用修改高度。

    【讨论】:

    • 您好 Rob:感谢您的回复。但是,即使使用如下代码: [listingOfViews objectAtIndex:a].center = ... 仍然会产生该错误。您提供的代码是否会随着更改重新保存位于数组中的指针?
    • 点表示法导致您出现问题。 -objectAtIndex:返回一个“id”(一个通用对象指针),因此编译器无法弄清楚如何处理“.center”。如果您按照我上面推荐的方式对其进行编码,编译器就会理解它。我提供的代码不需要“重新保存指针”。指针指向别的东西。它不会改变。当您调用 setFrame: 时,指向的内容会发生变化。我将重复我的建议,您可以查看我上面列出的书籍或斯坦福 iPhone 课程,或其他一些 ObjC 基础培训。这些是 ObjC 的基本概念。
    【解决方案2】:

    你的意思是:

    [listingOfViews replaceObjectAtIndex:a withObject:defaultViewStructure];
    

    但是当您尝试将那些未初始化的 tempView 指针放入数组时,它会崩溃。你真的想在这里做什么?我认为可能是时候退后一步,从 Objective-C 的基础开始。看起来您正在尝试将 C++ 概念直接移植到 ObjC 中,但它们的做法非常不同。

    您可能想从Programming in Objective-C 开始,然后可能是Cocoa Programming for Mac OS X。 (后者是基于 Mac 的,而不是 iPhone,但它仍然是最好的起点。)

    【讨论】:

    • 嗨 Rob:我不太想替换对象,只需将对象的值设置为另一个对象的值。当我在不使用 NSMutableArray 的情况下这样做时效果很好。此外,上面的代码只是我正在尝试做的一个示例(我的实际代码更长) - 在实际情况下,我正在初始化 UIView 的值。
    • “设置对象的值”是什么意思? UIView 没有值。但是,您确实有一个指向 UIView 的指针(这是您想要的),因此您可以将数组中的指针替换为指向不同对象的指针,这是我假设您想要的,以及此方法的用途做。
    • 您正在获取指向视图的指针。如果您说 [[listingOfViews objectAtIndex:a] setNeedsDisplay],那就可以了。但是您期望 [listingOfViews objectAtIndex:a]=tempView 实际做什么?你想修改数组中的对象(r​​eplaceObject:atIndex: 会)吗?或者您是否尝试在这行代码中以某种方式修改数组之外的内容?当您说“引用”时,您的意思是像 C++ 引用(MyClass&)吗?在 ObjC 中没有这样的东西,这就是为什么我担心你在编写 ObjC 时尝试用 C++ 思考,这是行不通的。
    • 嗨 Rob:对不起,我的措辞不正确 - 所以我会尝试用代码来表达它:“UIView *tempView = defaultViewStructure”工作得很好。但是,当您尝试从数组中获取指向该 tempView 的指针时,它会返回该错误。这有意义吗,如果没有,对不起......
    • 哎呀,重新发布以更正您发布的内容...对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多