-1

我在使用 NSTimer 并将秒表添加到通知中心时遇到问题;我对 Obj C 非常陌生,并且没有使用 Xcode。小部件编译并运行良好,但按下“开始:”没有任何作用,也没有 00.00.00。

#import "BBWeeAppController-Protocol.h"
#import "UIKit/UIKit.h"

static NSBundle *_NCTimerWeeAppBundle = nil;

@interface NCTimerController: NSObject <BBWeeAppController> {
    UIView *_view;
    UIImageView *_backgroundView;
    UILabel *stopWatchLabel;
}
@property (nonatomic, retain) UIView *view;
@property (nonatomic, retain) NSTimer *stopWatchTimer;
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) UILabel *stopWatchLabel;
@end

@implementation NCTimerController
@synthesize view = _view;
@synthesize stopWatchTimer = _stopWatchTimer;
@synthesize startDate = _startDate;
@synthesize stopWatchLabel = _stopWatchLabel;

+ (void)initialize {
    _NCTimerWeeAppBundle = [[NSBundle bundleForClass:[self class]] retain];
}

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

    } return self;
}

- (void)dealloc {
    [_view release];
    [_backgroundView release];
    [super dealloc];
}

- (void)loadFullView {
    // Add subviews to _backgroundView (or _view) here.
    UIButton *start = [UIButton buttonWithType:UIButtonTypeCustom];
    [start setTitle:@"Start:" forState:UIControlStateNormal];
    start.frame = CGRectMake(0, 0, 79, 33);
    [start addTarget:self action:@selector(timerStart) forControlEvents:UIControlEventTouchDown];
    [_view addSubview:start];
}

- (void)updateTimer:(NSTimer*)theTimer
{

    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];


    NSString *timeString = [dateFormatter stringFromDate:timerDate];
    self.stopWatchLabel.text = timeString;
}

- (void)timerStart
{
    self.startDate = [NSDate date];

    // Create the stop watch timer that fires every 10 ms
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                           target:self
                                                         selector:@selector(updateTimer)
                                                         userInfo:nil
                                                          repeats:YES];

    UIButton *stop = [UIButton buttonWithType:UIButtonTypeCustom];
    [stop setTitle:@"Stop:" forState:UIControlStateNormal];
    [stop addTarget:self action:@selector(timerStop) forControlEvents:UIControlEventTouchDown];
}

- (void)timerStop
{
    [self.stopWatchTimer invalidate];
    self.stopWatchTimer = nil;
    [self updateTimer];
}

- (void)loadPlaceholderView {
    // This should only be a placeholder - it should not connect to any servers or perform any intense
    // data loading operations.
    //
    // All widgets are 316 points wide. Image size calculations match those of the Stocks widget.
    _view = [[UIView alloc] initWithFrame:(CGRect){CGPointZero, {316.f, 33.f}}];
    _view.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    UIImage *bgImg = [UIImage imageWithContentsOfFile:@"/System/Library/WeeAppPlugins/StocksWeeApp.bundle/WeeAppBackground.png"];
    UIImage *stretchableBgImg = [bgImg stretchableImageWithLeftCapWidth:floorf(bgImg.size.width / 2.f) topCapHeight:floorf(bgImg.size.height / 2.f)];
    _backgroundView = [[UIImageView alloc] initWithImage:stretchableBgImg];
    _backgroundView.frame = CGRectInset(_view.bounds, 2.f, 0.f);
    _backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    [_view addSubview:_backgroundView];
}

- (void)unloadView {
    [_view release];
    _view = nil;
    [_backgroundView release];
    _backgroundView = nil;
    // Destroy any additional subviews you added here. Don't waste memory :(.
}

- (float)viewHeight {
    return 71.f;
}

@end

提前致谢!它可能看起来像一团糟,因为它是..

4

1 回答 1

0

我认为您在创建 NSTimer 后缺少这一行:

[self.stopWatchTimer fire];

不知道您所说的“没有 00.00.00”是什么意思。尽管。

编辑:很抱歉忘记了这一点,如果您执行 scheduleTimerWithTimeInterval,则无需调用“fire”。但是选择器必须具有签名(在您的情况下):

   - (void)updateTimer:(NSTimer*)theTimer {
...
}
self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                           target:self
                                                         selector:@selector(updateTimer:)
                                                         userInfo:nil
                                                          repeats:YES];

计时器在该消息中发送自己。试试看。

于 2013-02-24T08:57:35.847 回答