我对iOS还是很陌生,还有很多东西要学习,希望你们能从我的错误中引导我。

我最近学习了将数据从TableView传递到DetailView的想法,然后思考为什么不这样做。我还开始构建StopWatch应用程序,并认为日志功能将非常有用。

话虽如此,我目前正在构建一个秒表应用程序,它可以用作计时器并具有高分日志功能。它从View(秒表)到tableView(日志板),我正在使用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


SampleData.h

#import <Foundation/Foundation.h>

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


SampleData.m

#import "SampleData.h"

@implementation SampleData
@synthesize clueName,timeLog;
@end


SampleDataDAO.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

最佳答案

您的编码中有几个错误步骤:


您确实需要使用prepareForSegue将数据从父视图控制器传递给子视图控制器。您的情况是从TimerViewControllerHighScoreTableViewController
在您的HighScoreTableViewController类中,创建一个iVar数组,该数组将保存您将通过sampleDataTimerViewController即时传递过来的prepareForSeque数组。像这样:


HighScoreTableViewController.h

@property (nonatomic, strong) NSArray *arrayOfSampleData;


3。在prepareForSequeTimerViewController中,此行是错误的:

//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;

关于objective-c - iOS使用数据加载表格 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11342284/

10-13 03:50