-1

NSTimerに問題があり、通知センターにストップウォッチを追加しています。私はObjCを初めて使用し、Xcodeを使用していません。ウィジェットはコンパイルされて正常に実行されますが、「Start:」を押しても何も起こらず、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 がない」という意味がわかりません。けれど。

編集: 忘れて申し訳ありません。scheduledTimerWithTimeInterval を実行する場合は、「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 に答える