【问题标题】:Count - variable as part of object name [duplicate]计数 - 作为对象名称一部分的变量[重复]
【发布时间】:2015-03-23 06:45:36
【问题描述】:

如何将 count var (i = 1,2,3,4,...) 集成到对象名称中?

我的代码不起作用。

for (int i=1; (i<=4); i++) {
    self.cmdFertigOutlet(i).layer.cornerRadius = self.cmdAbbrechenOutlet(i).layer.cornerRadius = self.lblYear(i).layer.cornerRadius = self.lblMonth(i).layer.cornerRadius = self.lblDay(i).layer.cornerRadius = self.lblHour(i).layer.cornerRadius = self.lblMinute(i).layer.cornerRadius = self.lblSecond(i).layer.cornerRadius = self.txtBeschreibung(i).layer.cornerRadius = 5;
}

.h 文件

@property (weak, nonatomic) IBOutlet UIButton *cmdAbbrechenOutlet1;
@property (weak, nonatomic) IBOutlet UIButton *cmdFertigOutlet1;
@property (weak, nonatomic) IBOutlet UITextField *txtBeschreibung1;
@property (weak, nonatomic) IBOutlet UILabel *lblYear1;
@property (weak, nonatomic) IBOutlet UILabel *lblMonth1;
@property (weak, nonatomic) IBOutlet UILabel *lblDay1;
@property (weak, nonatomic) IBOutlet UILabel *lblHour1;
@property (weak, nonatomic) IBOutlet UILabel *lblMinute1;
@property (weak, nonatomic) IBOutlet UILabel *lblSecond1;

@property (weak, nonatomic) IBOutlet UIButton *cmdAbbrechenOutlet2;
@property (weak, nonatomic) IBOutlet UIButton *cmdFertigOutlet2;
@property (weak, nonatomic) IBOutlet UITextField *txtBeschreibung2;
@property (weak, nonatomic) IBOutlet UILabel *lblYear2;
@property (weak, nonatomic) IBOutlet UILabel *lblMonth2;
@property (weak, nonatomic) IBOutlet UILabel *lblDay2;
@property (weak, nonatomic) IBOutlet UILabel *lblHour2;
@property (weak, nonatomic) IBOutlet UILabel *lblMinute2;
@property (weak, nonatomic) IBOutlet UILabel *lblSecond2;

等等... 3,4

.m 文件而不是使用这个(有效),我将使用 for 语句。我不明白,如何将我的对象名称放入一个数组中,然后将它与 for 语句一起使用。

self.cmdFertigOutlet1.layer.cornerRadius =
self.cmdAbbrechenOutlet1.layer.cornerRadius = 
self.lblYear1.layer.cornerRadius = 
self.lblMonth1.layer.cornerRadius = 
self.lblDay1.layer.cornerRadius = 
self.lblHour1.layer.cornerRadius = 
self.lblMinute1.layer.cornerRadius =
self.lblSecond1.layer.cornerRadius = 
self.txtBeschreibung1.layer.cornerRadius = 5;

self.cmdFertigOutlet1.layer.masksToBounds =
self.cmdAbbrechenOutlet1.layer.masksToBounds = 
self.lblYear1.layer.masksToBounds = 
self.lblMonth1.layer.masksToBounds = 
self.lblDay1.layer.masksToBounds = 
self.lblHour1.layer.masksToBounds = 
self.lblMinute1.layer.masksToBounds = 
self.lblSecond1.layer.masksToBounds = 
self.txtBeschreibung1.layer.masksToBounds = YES;

self.cmdFertigOutlet2.layer.cornerRadius =
self.cmdAbbrechenOutlet2.layer.cornerRadius = 
self.lblYear2.layer.cornerRadius = 
self.lblMonth2.layer.cornerRadius = 
self.lblDay2.layer.cornerRadius = 
self.lblHour2.layer.cornerRadius = 
self.lblMinute2.layer.cornerRadius =
self.lblSecond2.layer.cornerRadius = 
self.txtBeschreibung2.layer.cornerRadius = 5;

self.cmdFertigOutlet2.layer.masksToBounds =
self.cmdAbbrechenOutlet2.layer.masksToBounds = 
self.lblYear2.layer.masksToBounds = 
self.lblMonth2.layer.masksToBounds = 
self.lblDay2.layer.masksToBounds = 
self.lblHour2.layer.masksToBounds = 
self.lblMinute2.layer.masksToBounds = 
self.lblSecond2.layer.masksToBounds = 
self.txtBeschreibung2.layer.masksToBounds = YES;

对象名称如下:

cmdFertigOutlet1、cmdFertigOutlet2、cmdFertigOutlet3 等等。

cmdAbbrechenOutlet1、cmdAbbrechenOutlet2、cmdAbbrechenOutlet3 等等 开

【问题讨论】:

标签: objective-c xcode6


【解决方案1】:

您不能 - 变量的名称是编译时属性,在运行时不存在。

改为使用包含四个元素的数组:

for (int i = 0; i < 4; i++) {
    self.cmdFertigOutlet[i].layer.cornerRadius = ...
}

【讨论】:

  • 嗨。对不起,我不明白。你能给我更多的代码示例吗?
【解决方案2】:

我将给你一个使用 NSTextField 对象的简单例子(为了简单起见)。我想你会明白如何在你的应用程序中实现这一点。

根据您的语法,我还假设您正在使用 Swift 编程。演示一种技术:

在我的 AppDelegate 类中,我将 IBOutlets 声明为 4 个文本框并在 IB 中连接它们:

@IBOutlet var testTextBox0:NSTextField!
@IBOutlet var testTextBox1:NSTextField!
@IBOutlet var testTextBox2:NSTextField!
@IBOutlet var testTextBox3:NSTextField!

我还声明了一个可变数组:

var testTextBoxes:NSMutableArray = NSMutableArray()

然后在 applicationDidFinishLaunching 函数中我说:

testTextBoxes.addObject(testTextBox0)
testTextBoxes.addObject(testTextBox1)
testTextBoxes.addObject(testTextBox2)
testTextBoxes.addObject(testTextBox3)

var localTextField:NSTextField = testTextBox0

for var i:Int = 0; i < 4; i++
{
    localTextField = testTextBoxes.objectAtIndex(i) as NSTextField
    localTextField.stringValue = "text field \(i)"
}

所有文本框字符串值都设置正确。

这说明了一种将对象加载到数组(或几种不同对象类型的数组)中并在 for 循环中顺序访问它们的技术。

这次是另一个在 Objective C 中使用按钮对象的例子:

transformButtons = [[NSMutableArray alloc] initWithCapacity:10]; // transformButtons is an instance variable
[transformButtons addObject:button0];
[transformButtons addObject:button1];
[transformButtons addObject:button2];
[transformButtons addObject:button3];
[transformButtons addObject:button4];
[transformButtons addObject:button5];
[transformButtons addObject:button6];
[transformButtons addObject:button7];
[transformButtons addObject:button8];
[transformButtons addObject:button9];

然后在后面的代码中:

NSButton *localButton;

for(int i = 0; i < 10; i++)
{
    localButton = [transformButtons objectAtIndex:i];
    [localButton setEnabled:YES];
    [localButton setHidden:NO];
    [localButton setTitle:buttonNames[i]];
}

当然,在 .h 文件中,这些东西被声明为:

NSMutableArray *transformButtons;
IBOutlet NSButton *button0;
IBOutlet NSButton *button1;
IBOutlet NSButton *button2;
IBOutlet NSButton *button3;
IBOutlet NSButton *button4;
IBOutlet NSButton *button5;
IBOutlet NSButton *button6;
IBOutlet NSButton *button7;
IBOutlet NSButton *button8;
IBOutlet NSButton *button9;

希望这会有所帮助。

EDIT2:

在.h文件中,如果你想从另一个类访问这些变量,为什么不呢:

@public

IBOutlet UIButton *cmdAbbrechenOutlet1;
IBOutlet UIButton *cmdFertigOutlet1;
IBOutlet UITextField *txtBeschreibung1;
IBOutlet UILabel *lblYear1;
IBOutlet UILabel *lblMonth1;
IBOutlet UILabel *lblDay1;
IBOutlet UILabel *lblHour1;
IBOutlet UILabel *lblMinute1;
IBOutlet UILabel *lblSecond1;

IBOutlet UIButton *cmdAbbrechenOutlet2;
IBOutlet UIButton *cmdFertigOutlet2;
IBOutlet UITextField *txtBeschreibung2;
IBOutlet UILabel *lblYear2;
IBOutlet UILabel *lblMonth2;
IBOutlet UILabel *lblDay2;
IBOutlet UILabel *lblHour2;
IBOutlet UILabel *lblMinute2;
IBOutlet UILabel *lblSecond2;

// And so on.....

@private

// Your private instance variables 

在您的 .m 文件中,cmdAbbrechenOutlet1 可以简单地作为 cmdAbbrechenOutlet1 访问。在 yourClass 可见的另一个类中,可以通过 yourClass->cmdAbbrechenOutlet1 访问它。

【讨论】:

  • 嗨。感谢您的回答。不,我的程序是用objective-c而不是swift编写的。请问可以用obj-c 写吗?
  • 嗨,谢谢,但不适用于标签和文本字段。按钮没问题。
  • 嗯...应该与标签和文本字段一起使用您可以发布一些不适合您的代码吗?我很乐意提供帮助。
  • 如果您发布了一些不适合您的代码,我会将其粘贴到我的一个应用中并找出问题所在。
  • 我已经更新了我的问题...见上文。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2013-06-19
  • 2014-10-31
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多