I have a UITableview that I have populated with data from a database, I know what to send data to another view (the detailViewController), however I can't get it to work, right now I am sending data via the - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { method. I have two classes the UITableview class and the detail class they are below. I also have an NSObject class that holds the objects for the database. Please check it out, here's my code:

UITableView Class code.:

Header File

 #import <UIKit/UIKit.h>
 #import <sqlite3.h>

@interface ExerciseViewController : UITableViewController {
NSMutableArray *theauthors;
sqlite3 * db;

}
@property(nonatomic,retain) NSMutableArray *theauthors;

-(NSMutableArray *) authorList;

@end

Implementation File

#import "ExerciseViewController.h"
#import "sqlColumns.h"
#import <sqlite3.h>
#import "UIColor+FlatUI.h"
#import "ExerciseDetailViewController.h"

@interface ExerciseViewController ()
@end
@implementation ExerciseViewController

- (void)viewDidLoad
{
[super viewDidLoad];

self.title = @"Abdominal";

[self authorList];

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

return [self.theauthors count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"exerciseCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}


sqlColumns *author = [self.theauthors objectAtIndex:indexPath.row];

UILabel *exerciseName = (UILabel *)[cell viewWithTag:101];
exerciseName.text = author.Name;

UILabel *equipment = (UILabel *)[cell viewWithTag:102];
equipment.text = author.Equipment;
NSString *string = author.Equipment;
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceCharacterSet]];
if ([trimmedString isEqualToString:@"null"]) {
     equipment.text = @"No Equipment";
}

UILabel *difficulty = (UILabel *)[cell viewWithTag:103];
difficulty.text = author.Difficulty;

if ([difficulty.text isEqualToString:@"Easy"]) {
    difficulty.textColor = [UIColor emerlandColor];
}
if ([difficulty.text isEqualToString:@"Intermediate"]) {
    difficulty.textColor = [UIColor belizeHoleColor];
}
if ([difficulty.text isEqualToString:@"Hard"]) {
    difficulty.textColor = [UIColor alizarinColor];
}
if ([difficulty.text isEqualToString:@"Very Hard"]) {
    difficulty.textColor = [UIColor alizarinColor];
}

UIImageView *cellImageView = (UIImageView *)[cell viewWithTag:100];
cellImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",author.File]];

UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor cloudsColor];
bgColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView:bgColorView];



return cell;
}

-(NSMutableArray *) authorList{
_theauthors = [[NSMutableArray alloc] initWithCapacity:10];
@try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"StayhealthyExercises.sqlite"];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
    {
        NSLog(@"An error has occured: %s", sqlite3_errmsg(db));

    }
    const char *query = "SELECT * FROM strengthexercises WHERE primarymuscle LIKE '%abdominal%'";
    const char *sql = query;

    sqlite3_stmt *sqlStatement;
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
    }else{

        while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
            sqlColumns * author = [[sqlColumns alloc] init];
            author.Name = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
            author.Muscle = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];
            author.Description = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 3)];
            author.File= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 4)];
            author.Sets= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 5)];
            author.Reps= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 6)];
            author.Equipment= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 7)];
            author.PrimaryMuscle= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 8)];
            author.SecondaryMuscle= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 9)];
            author.Difficulty= [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 10)];

            [_theauthors addObject:author];
        }
    }
    sqlite3_finalize(sqlStatement);
}
@catch (NSException *exception) {
    NSLog(@"Problem with prepare statement:  %s", sqlite3_errmsg(db));
}
@finally {
    sqlite3_close(db);

    return _theauthors;
}
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([segue.identifier isEqualToString:@"detail"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    sqlColumns *author = [self.theauthors objectAtIndex:indexPath.row];
    ExerciseDetailViewController *destViewController = segue.destinationViewController;
    destViewController.exerciseImage.image = [UIImage imageNamed:author.File];
    destViewController.descriptionLabel.text = author.Description;

        }

 }


 @end

Now the DetailViewController

Header file:

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

@interface ExerciseDetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *exerciseImage;
@property (weak, nonatomic) IBOutlet UILabel *descriptionLabel;
@property (nonatomic, strong) sqlColumns *author;

@end

Implementation File

#import "ExerciseDetailViewController.h"
#import "ExerciseViewController.h"

@interface ExerciseDetailViewController ()

@end

@implementation ExerciseDetailViewController
@synthesize exerciseImage,descriptionLabel,author;

- (void)viewDidLoad
{
[super viewDidLoad];

descriptionLabel.text = author.Description;
NSLog(@"%@",author.Description);
}


@end

Must be a small error, any help would be greatly appreciated!

有帮助吗?

解决方案

I think the problem is that your outlets are nil. You can only set the text and the image after the viewDidLoad get called.

Try to save your info in other properties and after viewDidLoad get called assign this info to your label and image view.

In your prepare for segue:

destViewController.image = [UIImage imageNamed:author.File];
destViewController.text = author.Description;

In your header add those properties:

@property (strong, nonatomic) UIImage *image;
@property (strong, nonatomic) NSString *text;

Then in your viewDidLoad:

exerciseImage.image = self.image;
descriptionLabel.text = self.text;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top