0

我对 iOS 还很陌生,还有很多东西要学,希望你们能指导我从我的错误中解脱出来。

我最近学习了将数据从 TableView 传递到 DetailView,并想,为什么不反过来呢。我也开始构建一个秒表应用,觉得日志功能会很有用。

话虽如此,我目前正在构建一个秒表应用程序,它可以用作计时器并具有高分日志功能。它从 View(stopwatch) 到 tableView(log board) 我使用 NSMutableArray 作为临时存储来保存信息,因为它们应该在应用程序启动/关闭时丢失。不幸的是,似乎通过到处跟踪和更改变量,我现在让自己感到困惑并陷入困境。

感谢你们提供的建议和帮助,并感谢@Abizern 给我提示。设法解决所有问题。将代码留在这里,以防将来有人做类似的事情。

TimerViewController.h

#import <UIKit/UIKit.h>
#import "SampleData.h"
#import "SampleDataDAO.h"
#import "HighScoreTableViewController.h"
@interface TimerViewController : UIViewController
{
    NSTimer *stopWatchTimer; // Store the timer that fires after a certain time
    NSDate *startDate; // Stores the date of the click on the start button
}
@property(nonatomic, strong) SampleDataDAO *daoDS;
@property(nonatomic, strong) NSMutableArray *ds;

@property (retain, nonatomic) IBOutlet UILabel *stopWatchLabel;
@property (weak, nonatomic) IBOutlet UIButton *onStartPressed;
@property (weak, nonatomic) IBOutlet UIButton *onStopPressed;
@property (weak, nonatomic) IBOutlet UIButton *onLogPressed;
@property (weak, nonatomic) IBOutlet UIButton *onHighscorePressed;

- (IBAction)onStartPressed:(id)sender;
- (IBAction)onStopPressed:(id)sender;
- (IBAction)onLogPressed:(id)sender;
- (IBAction)onHighscorePressed:(id)sender;

@end

TimerViewController.m

#import "TimerViewController.h"

@interface TimerViewController ()

@end

@implementation TimerViewController
@synthesize stopWatchLabel;
@synthesize onStartPressed;
@synthesize onStopPressed;
@synthesize onLogPressed;
@synthesize onHighscorePressed;
@synthesize ds,daoDS;
- (void)viewDidLoad
{
    [super viewDidLoad];
    daoDS = [[SampleDataDAO alloc] init];
    self.ds = daoDS.PopulateDataSource;
    onStopPressed.enabled=false;
}

- (void)viewDidUnload
{
    [self setStopWatchLabel:nil];
    [self setOnStartPressed:nil];
    [self setOnLogPressed:nil];
    [self setOnStopPressed:nil];
    [self setOnHighscorePressed:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        HighScoreTableViewController *detailViewController = [segue destinationViewController];
        detailViewController.arrayOfSampleData = self.ds;
   }
}



- (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss.S"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    stopWatchLabel.text = timeString;

}

- (IBAction)onStartPressed:(id)sender {
    startDate = [NSDate date];

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

- (IBAction)onStopPressed:(id)sender {
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer];
    onStartPressed.enabled=true;
}   

- (IBAction)onLogPressed:(id)sender {
    NSString * timeCaptured = stopWatchLabel.text;

    static NSInteger i = 1  ;
        SampleData* mydata = [[SampleData alloc]init];

        mydata.clueName=[NSString stringWithFormat:@"clue %d",i++ ];
        mydata.timeLog = timeCaptured;
        [self.ds addObject:mydata];


        NSLog(@"%@",mydata.clueName);
        NSLog(@"time %@", mydata.timeLog);
        NSLog(@"%d",[self.ds count]);
        mydata=nil;
    }

- (IBAction)onHighscorePressed:(id)sender {
    NSLog(@"Proceeding to HighScore");
}



@end

HighScoreTableView.h

    #import <UIKit/UIKit.h>
    #import "SampleData.h"
    #import "SampleDataDAO.h"
    #import "TimerViewController.h"
    @interface HighScoreTableViewController : UITableViewController
    @property (nonatomic, strong) NSMutableArray *arrayOfSampleData;
    @property (nonatomic, strong) SampleData * highscoreData;
    @end


HighScoreTableView.m

#import "HighScoreTableViewController.h"

@interface HighScoreTableViewController ()

@end

@implementation HighScoreTableViewController
@synthesize highscoreData;
@synthesize arrayOfSampleData;
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)viewDidLoad
{
    highscoreData = [[SampleData alloc]init];
    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.arrayOfSampleData.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"highscoreCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    //highscoreData = [self.arrayOfSampleData objectAtIndex:indexPath.row];

highscoreData = (SampleData *)[self.arrayOfSampleData objectAtIndex:indexPath.row];  //if above line doesn't work, use this
cell.textLabel.text=[NSString stringWithFormat:@"%@ time %@",highscoreData.clueName, highscoreData.timeLog];
return cell;
}


#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}

@end

样本数据.h

#import <Foundation/Foundation.h>

@interface SampleData : NSObject
@property(nonatomic,strong) NSString * clueName;
@property(nonatomic,strong) NSString * timeLog;
@end

样本数据.m

#import "SampleData.h"

@implementation SampleData
@synthesize clueName,timeLog;
@end

样本数据DAO.h

#import <Foundation/Foundation.h>
#import "SampleData.h"
@interface SampleDataDAO : NSObject
@property(nonatomic, strong) NSMutableArray * someDataArray;

-(NSMutableArray *)PopulateDataSource;
@end

SampleDataDAO.m(不确定是否需要这个 DAO NSObject)

#import "SampleDataDAO.h"

@implementation SampleDataDAO
@synthesize someDataArray;

-(NSMutableArray *)PopulateDataSource
{
    someDataArray = [[NSMutableArray alloc] init];
    SampleData * mydata = [[SampleData alloc] init];


   mydata = nil;


    return someDataArray;
} 
@end
4

3 回答 3

1

在您HighScoreTableViewController中,您需要访问您的数组,例如通过声明和定义可写属性:

@property(nonatomic, strong) NSMutableArray *myArr;

那么你可以定义

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return [self.myArr count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // ... like in your code

    // Tried changing variable here and there base on tutorial, but can't seem to get it right.** 

    SampleData * sample = (SampelData *) [self.myArr objectAtIndex:indexPath.row];
    cell.textLabel.text = @"%@ time %@ ",sample.clueName, sample.timeLog;
    NSLog(@"Cell Value %d %@",indexPath.row,  cell.textLabel.text);
    return cell;
}

所以基本上你只需要在你的方法定义中改变两行。大多数情况下,您使用 TableViews 是这样的:将要从中读取数据的数组分配给自定义属性。返回数组的大小tableView:numberOfRowsInSection:并从适当的索引中获取一个对象以填充 中的单元格tableView:cellForRowAtIndexPath:

如果您的数组内容发生变化,您必须执行额外的操作来更新您的表格视图。

于 2012-07-05T10:47:51.620 回答
1
  • 首先在 .h 文件中声明数组(例如NSMutableArray *arrStopwatchDetails)。
  • 创建该数组的属性,如@property(nonatomic,retain)NSMutableArray *arrStopwatchDetails.
  • 在 .m 文件中合成数组,例如@synthesize arrStopwatchDetails.
  • 在 viewDidLoad 或要使用之前分配数组。

    前任。self.arrStopwatchDetails = [[NSMutableArray alloc]init];

  • numberOfRowsInSection方法中,返回类似于 return 的数组计数[self.arrStopwatchDetails count]

  • In cellForRowsAtIndexPath方法,将数组元素的值分配给单元格文本

SampleData * sample = [[[SampleDataDAO alloc]init ].self.arrStopwatchDetails objectAtIndex:indexPath.row]; cell.textLabel.text = @"%@ time %@",sample.clueName, sample.timeLog; 就是这样。

于 2012-07-05T11:23:46.460 回答
1

您的编码中有几个失误:

  1. 您确实需要使用prepareForSegue将数据从父视图控制器传递到子视图控制器。在您的情况下,从TimerViewControllerHighScoreTableViewController

  2. 在您的HighScoreTableViewController班级中,创建一个 iVar 数组,该数组将保存sampleData您将TimerViewController通过prepareForSeque. 像这样的东西:

HighScoreTableViewController.h

@property (nonatomic, strong) NSArray *arrayOfSampleData;

3. 在您prepareForSeque的 中TimerViewController,这一行是错误的:

//TimerViewController.highscoreData = [self.ds objectAtIndex:[self.tableView indexPathForSelectedRow].row];

试试这个:

detailViewController.arrayOfSampleData = self.ds;

4. 在 HighScoreTableViewController.m 的 viewDidLoad 下,替换这个

highscoreData = (SampleData *)self.highscoreData;

和:

highscoreData = [SampleData alloc]init];

5. 在 numberOfRowsInSection 中,您现在可以这样做:

return self.arrayOfSampleData.count;

6. 在 cellForRowAtIndexPath 中,

highscoreData = [self.arrayOfSampleData objectAtIndex:indexPath.row];

//highscoreData = (SampleData *)[self.arrayOfSampleData objectAtIndex:indexPath.row];  //if above line doesn't work, use this

cell.textLabel.text = @"%@ time %@ ", highscoreData.clueName, highscoreData.timeLog;
于 2012-07-05T13:19:14.327 回答