Count - 变量作为对象名称的一部分

时间:2015-01-24 07:20:19

标签: objective-c xcode6

如何将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等等   上

2 个答案:

答案 0 :(得分:2)

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

相反,使用包含四个元素的数组:

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

答案 1 :(得分:1)

我将给你一个使用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-&gt; cmdAbbrechenOutlet1进行访问。