你是怎么做到的?请参阅下面的代码示例:
- (void)methodA {
...
UILabel *label1 = [[UILabel alloc] initWithFrame:frame];
...
}
- (void)methodB {
label1.text = "Label 1";
}
编辑:为什么我想知道这是因为我无法为该类设置实例变量。因为当课程加载我需要的UILabel
时,我不会知道。每次加载类时它都会有不同的数量。因此,我需要在方法中动态创建这些UILabel,然后能够以方便的方式在整个类的其余部分访问这些标签。
答案 0 :(得分:3)
您无法从其他函数访问函数的局部变量。局部变量仅在调用函数时存在,并且在函数返回时销毁。
为此使用实例变量。
@interface MyClass: NSObject
{
UILabel * label1;
}
- ( void )methodA;
- ( void )methodB;
@end
@implementation MyClass
- ( id )init
{
if( ( self = [ super init ] ) )
{
UILabel * label1 = [ [ UILabel alloc ] initWithFrame: CGRectZero ];
}
}
- ( void )dealloc
{
[ label1 release ];
[ super dealloc ];
}
- ( void )methodA
{
/* label1 is now a valid instance of UILabel */
}
- ( void )methodB
{
label1.text = @"Label 1";
}
@end
答案 1 :(得分:2)
听起来您可能想要检查您的设计,跟踪您需要动态创建的标签并不容易。但既然这是你当前的用例,那么你想要做的就是保持Mutable Array标签。这样,您可以根据需要创建任意数量的内容,并且仍然可以在您的方法中共享信息(作为您班级中的ivar)。因此,您的类定义将具有此功能(代码从@Macmade中窃取并更新):
@interface MyClass: NSObject {
NSMutableArray * _labels;
}
@property (nonatomic, retain) NSMutableArray * labels;
- ( void )methodA;
- ( void )methodB;
@end
在您的方法A中,您可以创建新标签并将其添加到阵列中。在您的方法B中,您找到一个标签并设置其文本属性。
@implementation MyClass
@synthesize labels = _labels;
- ( id ) init
{
if( ( self = [ super init ] ) ) {
[self setLabels: [NSMutableArray arrayWithCapacity: 8];
}
}
- ( void ) dealloc
{
[ self.labels release ];
[ super dealloc ];
}
- ( void ) methodA
{
UILabel *label = [[UILabel alloc] initWithFrame:frame];
[self.labels addObject: label];
}
- ( void ) methodB
{
// You need to locate the label you work with. One way is by index, crude example below
UILabel * theLabel = (UILabel * ) [self.labels objectAtIndex: 0];
theLabel.text = @"Label 1";
}
@end
你需要一些很好的方法来确定你正在处理的标签 - 指数可能不是最好的。理想情况下,您实际上会使用NSMutableDictionary并存储由其名称键入的标签。
希望有所帮助。
答案 2 :(得分:1)
如果methodA正在调用methodB,则将其作为参数传递。如果不是那么你应该在头文件中声明它。
这是关于可变范围的。当您的方法存在时,内部声明的所有变量都将被销毁。显然你可以使用return关键字来传递值,但是你不能使用你在methodA中声明它的名称来使用变量。
在这种情况下,您似乎需要将其添加到头文件中:
UILabel *label1;
执行此操作时,您将能够在方法A中分配和初始化变量,然后在方法B中设置其值。请记住方法A的第一行将成为。
label1 = [[UILabel alloc] initWithFrame:frame];
希望这有帮助。
答案 3 :(得分:0)
通过在头文件中定义label1。
答案 4 :(得分:0)
使用参数:
- (void)methodA {
...
UILabel *label1 = [[UILabel alloc] initWithFrame:frame];
[self methodB:label1];
}
- (void)methodB:(UILabel *)label1 {
label1.text = "Label 1";
}
或者通过在@interface中创建一个对象属性(参见object-c指南中的属性)。没有其他好方法。
答案 5 :(得分:0)
我有时使用的另一个噱头是在app委托中创建一个变量,然后每个函数都可以访问然后修改变量...我通常不会在你的情况下使用它但它通常应该工作...希望它帮了!如果需要,请不要犹豫,要求更多元素。
CU!