iOS - 从同一类中的方法B访问方法A中声明的变量

时间:2011-07-18 14:41:58

标签: objective-c methods

你是怎么做到的?请参阅下面的代码示例:

- (void)methodA {
    ...
    UILabel *label1 = [[UILabel alloc] initWithFrame:frame];
    ...
}

- (void)methodB {

    label1.text = "Label 1";
}

编辑:为什么我想知道这是因为我无法为该类设置实例变量。因为当课程加载我需要的UILabel时,我不会知道。每次加载类时它都会有不同的数量。因此,我需要在方法中动态创建这些UILabel,然后能够以方便的方式在整个类的其余部分访问这些标签。

6 个答案:

答案 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!