3

我有一个问题。也许我在错误的地方或什么地方有什么东西,但是我就是想不通!任何帮助,将不胜感激。

我试图简单地以编程方式制作一个仅在我的子视图中显示的时钟。

我已经设置了一个计时器以及一个我想在我创建的子视图中显示的更新器 -(void)。我正在以编程方式构建子视图,这就是不添加 IBOutlet 并将其连接到我的故事板的原因 - 我正在尝试仅使用代码来完成所有操作。

我的 updateTimer 标签上出现错误,上面写着 - 使用未声明的标识符“rightLabel”,这对我来说不起作用。哈哈 - 任何帮助将不胜感激!

。H

@interface DemoRootViewController : UIViewController <PaperFoldViewDelegate> {
    NSTimer *timer;
}
@property (nonatomic, strong) UIView *rightView;
-(void)updateTimer;

.m

- (id)init
{
    self = [super init];
    if (self) {

        //Timer Setup
        timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

        //PaperFold Setup
        _paperFoldView = [[PaperFoldView alloc] initWithFrame:CGRectMake(0,0,[self.view bounds].size.width,[self.view bounds].size.height)];
        [_paperFoldView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
        [self.view addSubview:_paperFoldView];

        //Setup Subview
        _rightView = [[UIView alloc] initWithFrame:CGRectMake(0,0,240,[self.view bounds].size.height)];

        //Setup UILabel
        UILabel *rightLabel = [[UILabel alloc] initWithFrame:_rightView.frame];
        [_rightView addSubview:rightLabel];

        //Using PaperFold Framework to Add the Subview (this works fine)
        [_paperFoldView setRightFoldContentView:_rightView foldCount:2 pullFactor:1];

    }
    return self;
}


-(void)updateTimer {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"hh:mm:ss"];
    //This is where I get my error "Use of Undeclared Identifier 'rightLabel' 
    rightLabel.text = [formatter stringFromDate:[NSDate date]];
}

@end
4

3 回答 3

3

您没有rightLabel声明为属性(或实例变量)。只需将您的 .m 更改为以下代码:

.m

@interface DemoRootViewController ()
@property (nonatomic, strong) UILabel *rightLabel;
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@end

@implementation DemoRootViewController
- (id)init
{
    self = [super init];
    if (self) {

        //Timer Setup
        timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

        //PaperFold Setup
        _paperFoldView = [[PaperFoldView alloc] initWithFrame:CGRectMake(0,0,[self.view bounds].size.width,[self.view bounds].size.height)];
        [_paperFoldView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
        [self.view addSubview:_paperFoldView];

        //Setup Subview
        _rightView = [[UIView alloc] initWithFrame:CGRectMake(0,0,240,[self.view bounds].size.height)];

        //Setup UILabel
        self.rightLabel = [[UILabel alloc] initWithFrame:_rightView.frame];
        [_rightView addSubview:self.rightLabel];

        //Using PaperFold Framework to Add the Subview (this works fine)
        [_paperFoldView setRightFoldContentView:_rightView foldCount:2 pullFactor:1];

        //Formatter setup
        self.formatter = [[NSDateFormatter alloc] init];
        [self.formatter setDateFormat:@"hh:mm:ss"];
    }
    return self;
}


-(void)updateTimer {
    self.rightLabel.text = [self.formatter stringFromDate:[NSDate date]];
}

@end

@interface DemoRootViewController ()部分称为类扩展。它本质上允许您“私有”属性,因此它们不会通过头文件公开。如果您希望它们公开,只需将两个属性定义放入 .h 文件中。

于 2013-03-07T23:29:19.943 回答
2

由于您要更新标签,请将标签变量设为实例变量。然后你可以在方法中创建它并在init方法中访问它updateTimer

此外,使日期格式化程序成为实例变量,因此您只需在init方法中创建一次。无需每半秒创建一个新的日期格式化程序。

并且由于您timer应该是私有实例变量,因此请将其从 .h 文件中删除并放入 .m 文件中。

@implementation DemoRootViewController {
    NSTimer *timer;
}

也在那里添加rightLabelformatterivars。

此外,updateTimer从 .h 文件中删除声明。这是仅由 .m 文件中的实现使用的私有方法。将其添加到 .h 文件允许其他类调用该方法。

于 2013-03-07T23:30:00.513 回答
0

您必须在 .h 文件中声明 UILabel *rightLabel ,因为您也在另一个方法中使用 rightLabel 。

于 2013-03-08T04:09:34.207 回答