所以我对将NSString传递给类感到困惑。我有一个绘制一个小盒子的传奇类,并且盒子上有一个标签。我的框本质上是一个UIView对象,我在其中更改背景颜色。在我的init方法中,我初始化该框,然后从我创建此类实例的其他类中设置背景颜色。但是,在NSString的情况下,我不知道如何alloc / init,并从另一个类设置其文本。这是我的传奇代码。
- (id)sharedInit {
self.backgroundColor = [UIColor clearColor];
self.LegendBox = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height / 2 - LEGEND_SIZE / 2, LEGEND_SIZE, LEGEND_SIZE)]; // hugs LHS, centered vertically
self.LegendLabel = [[NSString alloc] init];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 0, self.bounds.size.width - 25, self.bounds.size.height)];
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor clearColor];
label.text = self.LegendLabel;
label.font = [UIFont fontWithName:@"Arial" size:14.0];
label.numberOfLines = 5;
label.lineBreakMode = UILineBreakModeWordWrap;
[self addSubview:label];
[self addSubview:_legendBox];
return self;
}
然后当我尝试在我的另一个类中创建一个legend类的实例时:
PieChartLabelView *labelView1 = [[PieChartLabelView alloc] initWithFrame:CGRectMake(0, 0, 140, 80)];
labelView1.LegendBox.backgroundColor = BLUE_COLOR;
NSString *str1 = [[NSString alloc] initWithFormat:@"as;flkasjdf;laksjdf"];
labelView1.LegendLabel = str1;
[self addSubview:labelView1];
[str1 release];
[labelView1 release];
我的标签没有任何文字。
我试图更好地理解自我/ ivars / setter / getters的第二个问题是在我的传奇课程中,为什么我可以使用
[self addSubview:_legendLabel];
与self.LegendLabel?我还是完全不明白。感谢。
答案 0 :(得分:1)
第二部分
首先回答你的第二个问题,
[self addSubview:_legendLabel];
或
[self addSubview:self.legendLabel];
如果你没有进行任何惰性实例化,应该是相同的。大多数情况下,getter方法会检索该值,因此您应该采用第一种方法。但是,如果您通过定义自己的getter方法来执行任何惰性实例化,您可以执行此类操作,
- (UILabel *)legendLabel {
if ( !_legendLabel ) {
// Instantiate _legendLabel
}
return _legendLabel;
}
如果你没有self.legendLabel
,它会有不同的含义。
第一部分
这是您的第二个问题增加了一些混乱的地方,当您尝试在第二个问题中将其添加为子视图时,您似乎将LegendLabel
称为NSString
变量。
然而,你似乎期待着这一点 -
labelView1.LegendLabel = str1;
更改标签文字,因为您在sharedInit
方法 -
label.text = self.LegendLabel;
这不会影响标签文本,原因有两个,
LegendLabel
,则它们都会指向两个不同的对象。 NSString
属性被声明为copy
属性以防止可变性。因此,即使LegendLabel
可变,也无法更改标签的文本。这意味着您必须使标签成为实例变量或属性,以便您可以直接访问标签并更新它的text
属性或重写LegendLabel
的setter方法来更新标签
但是我认为将标签声明为属性是采取的方法,而LegendLabel
的命名有点令人困惑。如果它是一个标签会更好。
答案 1 :(得分:0)
创建NSString时,您应该直接这样做:
NSString *str1 = @"ñalskdfjsdañlkfj";
如果你想使用一种格式,你可以这样做:
NSString *str2 = [NSString stringWithFormat:@"This is string %d", 2];
如果你想将它作为一个类中的属性使用,你应该这样声明:
@property (copy) NSString *str3;