2014-06-11 66 views
0

在我的iOS應用程序中,我有一個自定義UITableViewCell,它是我的FirstViewController中TableView的一部分。在FirstViewController中,我有一個對象數組,它對應於填充行,然後是該數組中具有屬性的對象。從FirstViewController在自定義UITableViewCell中訪問屬性

我在每個單元格中都有一個計時器,我需要從相應對象的屬性中獲取計時器的長度。我試過導入FirstViewController.h,但無論如何我都會收到錯誤「property not found on object of type」。

我已經在FirstViewController的cellForRowAtIndexPath方法中創建和配置了對象,但我希望能在TableViewCell.m的方法中使用它。

有沒有一種方法可以使用TableViewCell中的數組或對象?還是應該在FirstViewController中實現該方法?

EDIT#1:

我移動cell.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:cell selector:@selector(startTimer) userInfo:nil repeats:YES];到FirstViewController的cellForRow...方法。現在計時器運行所需的時間,但不再由按鈕啓動。它在TableView加載時立即運行,並在每次重新加載TableView時重新啓動。

這裏是我的ATCTableViewCell.h文件:(更新與編輯#2)

#import <UIKit/UIKit.h> 
#import "ATCFirstViewController.h" 

@interface ATCTableViewCell : UITableViewCell 

- (void)startTimer; 
// Contents moved to cellForRow... -> - (IBAction)playTimer:(id)sender; 

@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property (weak, nonatomic) IBOutlet UILabel *timeLabel; 
@property (weak, nonatomic) IBOutlet UIButton *playButton; 
@property (weak, nonatomic) IBOutlet UIButton *pauseButton; 

@property NSTimer *timer; 
@property int secondsCount; // initially the length in seconds and then decreased 

@end 

編輯#2:

定時器的是,在startTimer方法改變標籤的減量定時器這是在ATCTableViewCell.m。此標籤是此時單元格的屬性以及另一個標籤和按鈕。我將致力於將事物移動到對象類,而不是將它們作爲單元格的屬性。

這裏是startTimer方法:

- (void)startTimer { 

    self.secondsCount--; 
    int hours = self.secondsCount/3600; 
    int minutes = (self.secondsCount/60) - (hours * 60); 
    int seconds = self.secondsCount - (hours * 3600) - (minutes * 60); 

    NSString *timerOutput = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; 
    self.timeLabel.text = timerOutput; 

    if (self.secondsCount == 0) { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 
} 

這是我ATCObject.h文件:

#import <Foundation/Foundation.h> 

@interface ATCObject : NSObject 

@property NSString *title; 

@property int lengthInSeconds; 
@property int initialHours; 
@property int initialMinutes; 

@end 

感謝

+0

認爲它這樣。單元格只是顯示「模型數據」的「視圖」。模型和觀點應儘可能獨立生活。有一個「控制器」層,它接受模型數據,並將其提供給一個視圖來顯示。 tableView委託類是這個實例中的控制器(FirstViewController)。你的細胞應儘可能少做。它有幾個只顯示數據的視圖。我仍在考慮解決這個問題的最佳方法,因此我現在的答案可能不正確。 – Justin

+0

不知道你跟蹤的對象是如何設置的,很難確定如何進行。計時器在做什麼?這是遞減計數器?那個計數器是否對應一個標籤,間隔是多少,以及您的預期結果是什麼 – Justin

+0

現在我認爲NSTimer對象應該存在於您的自定義對象中,而不是單元格中。我現在也在想,CustomObject應該有一個對單元格的引用,而不是相反。這樣,自定義對象可以更新自己的屬性,然後讓單元更新其視圖,而不是查詢對象的單元以詢問顯示內容。 – Justin

回答

0

我更新基於所有先前討論的這個答案。

@interface ATCObject : NSObject 
@property (nonatomic, strong) NSString *title; 
@property (nonatomic, assign) NSInteger lengthInSeconds; 
@property (nonatomic, assign) NSInteger initialHours; 
@property (nonatomic, assign) NSInteger initialMinutes; 
//Move the NSTimer and the -playTimer method to this class 
@property (nonatomic,strong) NSTimer *timer; 
-(void)startTimer; 
-(void)timerTick; 
-(void)pauseTimer; 
@end 

在你的tableView控制器類:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Identifier"; 
    ATCTableViewCell *cell = (ATCTableViewCell *)[tableView dequeueReusableCellForIdentifer:Identifier]; 
    if (!cell) { 
     cell = [[ATCTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault identifier:Identifier]; 
     [cell.playButton addTarget:self action:@selector(playTouched:) forControlEvents:UIControlEventTouchUpInside]; 
     [cell.pauseButton addTarget:self action:@selector(pauseTouched:) forControlEvents:UIControlEventTouchUpInside]; 
    } 
    ATCObject *objectForRow = [myDataArray objectAtIndex:indexPath.row]; 
    cell.timeLabel.text = objectForRow.title; 
    return cell; 
} 

//Also in your controller class 
-(void)playTouched:(id)sender { 
    //you may need to change self.tableView to however you reference the table in your class 
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition]; 
    if (indexPath != nil) { 
     ATCObject *currentObject = [myDataArray objectAtIndex:indexPath.row]; 
     [currentObject startTimer]; 
    } 
} 

//ATCObject.m 
-(void)startTimer { 
    if (!self.timer) { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
        target:self 
        selector:@selector(timerTick:) 
        userInfo:nil 
        repeats:YES]; 
    } 
} 

-(void)timerTick { 
    //Already assuming lengthInSeconds is set 
    if (lengthInSeconds > 0) { 
     lengthInSeconds--; 
     //Do your math to get total hours and minutes 
     NSInteger totalHours = //math stuff convert lengthInSeconds 
     NSInteger totalMinutes = //more math stuff etc 
     NSString *newTitle = [NSString stringWithFormat:@"%i:%i",totalHours,totalMinutes]; 
     self.title = newTitle; 
    } else { 
     self.title = @"00:00"; 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 
} 
+0

好吧,現在我已經將設置移動到'cellForRow ...'方法,但後來我必須使用'scheduledTimerWithTimeInterval:...'調用'startTimer'方法,該方法仍然存在於TableViewCell.m中。如果方法處於不同的類中,選擇器會是什麼?我有'選擇器:@selector(startTimer)' – Benck

+0

你應該用你的Cell類的頭文件編輯你的問題。 – Justin

+0

你有一個設計「問題」,取決於你如何看待它。您的自定義單元是否需要有自己的計時器,或者計時器是否可以放在您正在跟蹤的對象內?你說你有一組填充單元格的自定義對象,對吧?如果計時器與你正在追蹤的物體有更多的關係,你應該把計時器移到那裏。這是一種使用「MVC - 模型,視圖,控制器」設計模式的方法。發佈「自定義對象」類的標題! – Justin