【问题标题】:Objective C variable counting [duplicate]Objective C变量计数[重复]
【发布时间】:2013-02-24 07:37:26
【问题描述】:

我有一些变量,例如 vh1 vh2 vh3 等。 是否可以在 for 循环中计算 i 变量?

我的意思是for(int i = 1; blablabla) { [[vh + i] setBackGroundColor blablabla];}

问候

编辑:vh1 等是 UILabel!!!

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    虽然这可以通过introspection 实现,但如果您有这样的变量,最好将它们放在 NSArray 中,并使用索引访问它们。

    【讨论】:

    • 但是变量是针对UILabels的,所以可以把它们放在一个数组中吗?
    • 你有我的例子吗?直到现在我做IBOutlet UILabel *vh1;(和其他人一样)我怎样才能把它放到一个数组中?
    • 您可以在界面生成器中创建一个 IBOutletCollection,或者只是将它们添加到代码中的数组中(使用@[vh1,vh2,vh3] 是最简单的)。
    【解决方案2】:

    正如其他回答者所指出的,使用新的数组语法,您可以很容易地构造一个包含所有对象的数组,但即使您随后更改原始 ivars 的值,它也会保留旧值。这可能是也可能不是你所追求的。

    如果您一心想要将变量保存为单个对象(而不是数组),那么您可以使用键值编码以编程方式访问它们。键值编码也称为KVC。

    执行此操作的方法是valueForKey:,可用于self 和其他对象。

    MyClass *obj = ... // A reference to the object whose variables you want to access
    
    for (int i = 1; i <= 3; i++) {
        NSString *varName = [NSString stringWithFormat: @"var%d", i];
    
        // Instead of id, use the real type of your variables
        id value = [obj valueForKey: varName];
    
        // Do what you need with your value
    }
    

    docs 中有更多关于 KVC 的内容。

    为了完整起见,这种直接访问之所以有效,是因为一个标准的 KVC 兼容对象继承了一个名为 accessInstanceVariablesDirectly 的类方法。如果您想要支持这种直接访问,那么您应该覆盖accessInstanceVariablesDirectly,使其返回NO

    【讨论】:

    • 'obj' undeclared :/
    • @user1794338 这只是一种引用您拥有变量的对象的方式。也可以是自己。将编辑答案。
    【解决方案3】:

    如果你是从 XIB 加载UILabels,你可以使用IBOutletCollection

    声明属性:

    @property (nonatomic, strong) IBOutletCollection(UILabel) NSArray *labels;
    

    现在您可以将 XIB 中的多个标签链接到此属性。然后在-viewDidLoad(加载XIB之后),你的数组被填充,你只需使用简单的for-in

    for (UILabel *label in self.labels) {
        label.backgroundColor = ...
    }
    

    【讨论】:

    • 也不起作用:/ Expected a property attribute before 'strong'
    • 我将该行复制/粘贴到代码中,它可以编译并运行。
    【解决方案4】:

    您可以通过以下代码访问每个值。

    UILabel *label1;
    UILabel *label2;
    UILabel *label3;
    NSArray *array = @[label1, label2, label3];
    for (int i = 0; i<3; i++) {
        [array objectAtIndex:i];
    }
    

    向 NSArray 添加值可用于对其进行初始化。 如果以后想添加值,可以使用 NSMutableArray。


    我修改了我的代码。

    UILabel *label1 = [[UILabel alloc] init];
    UILabel *label2 = [[UILabel alloc] init];
    UILabel *label3 = [[UILabel alloc] init];
    NSArray *array = @[label1, label2, label3];
    for (int i = 0; i<3; i++) {
        UILabel *label = [array objectAtIndex:i];
        label.frame = CGRectMake(0, i*100, 150, 80);
        label.text = [NSString stringWithFormat:@"label%d", i];
        [self.view addSubview:label];
    }
    

    【讨论】:

    • 感谢您的所有回答。我正在使用IBOutlet UILabel *vh1; 等创建它们,然后尝试在数组中使用它们,但它不起作用。 Expected blablabla before '=' token :/
    • 你在viewController上写这段代码吗?你想在显示器上显示 UILabel 吗?
    • 是的,它将是一个 iPhone 应用程序,我在 viewController 上编写此代码
    • 但我在 .h 文件中使用 IBOutlet 声明它们,并想在 .m 文件中通过 for 循环使用它们,但这并没有真正起作用:(
    • 所以,你应该这样初始化,在.h文件中:UILabel *label1;,在.m文件中:label1 = [[UILabel alloc] init];
    猜你喜欢
    • 2014-09-16
    • 2013-08-18
    • 2013-03-03
    • 1970-01-01
    • 2013-09-04
    • 2013-02-18
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多