Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

iphonedude2008

macrumors 65816
Original poster
I'm making my first app with table views and I am having trouble with the logic of it. I have a data source object with an array that contains various objects such as uiimage and nsurls pointing to word, pages, pdfs, ect. that are displayed by a uiwebview. However, before they are loaded, i want to show a table listing all the objects.
The problem is, i dont know how to display a name in the uilabel for each cell. I want the user to be able to edit the name also.

heres the code for the model
Code:
#import <Foundation/Foundation.h>

@interface CQStorageModel : NSObject<NSCoding>

@property (strong, nonatomic) NSMutableArray *dataSource;
@property (strong, nonatomic) NSURL *savingUrl;
@property (strong, nonatomic) NSURL *appSupportUrl;

- (id) initWithDataSource;
- (void) saveDataSource;

- (void) addProject: (NSMutableArray *) arry withName: (NSString *) string;
- (void) removeProjectAtIndex: (NSUInteger) index;

- (void) addObject: (id<NSCoding>) object toProjectAtIndex: (NSUInteger) index;
- (void) removeObjectAtIndex: (NSUInteger) index1 inProjectAtIndex: (NSUInteger) index2;
- (id) loadObjectAtIndex: (NSUInteger) index1 inProjectAtIndex: (NSUInteger) index2;

@end
implementation file
Code:
#import "CQStorageModel.h"

@implementation CQStorageModel

- (void) encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.dataSource forKey:@"dataSource"];
    [aCoder encodeObject:self.savingUrl forKey:@"savingUrl"];
    [aCoder encodeObject:self.appSupportUrl forKey:@"APUrl"];
}

- (id) initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    self.dataSource = [aDecoder decodeObjectForKey:@"dataSource"];
    self.savingUrl = [aDecoder decodeObjectForKey:@"savingUrl"];
    self.appSupportUrl = [aDecoder decodeObjectForKey:@"APUrl"];
    return self;
}

- (id) initWithDataSource {
    self = [super init];
    if (self) {
        NSFileManager *fm = [[NSFileManager alloc]init];
        self.appSupportUrl = [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        
        if (!self.appSupportUrl)
            self.appSupportUrl = [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
        
        self.savingUrl = [self.appSupportUrl URLByAppendingPathComponent:@"CQStorageModel.cqstm"];
        NSData *data = [[NSData alloc]initWithContentsOfURL:self.savingUrl];
        
        if (data)
        self = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
    
    return self;
}

- (void) saveDataSource {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
    [data writeToURL:self.savingUrl atomically:NO];
}

- (void) addProject: (NSMutableArray *) arry withName: (NSString *) string {
    [arry insertObject:string atIndex:0];
    [self.dataSource addObject:arry];
}

- (void) removeProjectAtIndex:(NSUInteger)index {
    [self.dataSource removeObjectAtIndex:index];
}

- (void) addObject:(id<NSCoding>)object toProjectAtIndex:(NSUInteger)index {
    [[self.dataSource objectAtIndex:index] addObject:object];
}

- (void) removeObjectAtIndex:(NSUInteger)index1 inProjectAtIndex:(NSUInteger)index2 {
    if (index1 != 0)
        [[self.dataSource objectAtIndex:index2] removeObjectAtIndex:index1];
}

- (id) loadObjectAtIndex:(NSUInteger)index1 inProjectAtIndex:(NSUInteger)index2 {
    id object = [[self.dataSource objectAtIndex:index2]objectAtIndex:index1];
    return object;
}




@end
 
Last edited:
Well, looks like you've got your storage sorted. Now you need to implement the UITableViewDataSource protocol. You could extend CQStorageModel to implement UITableViewDataSource directly, or you could create a new class which calls into your CQStorageModel.

The key methods you'll need to implement are:

– tableView:numberOfRowsInSection:
– tableView:cellForRowAtIndexPath:

Then you need to pass your UITableViewDataSource object to the table view using:

tableView.dataSource = myTableData;
 
Have a look on Apple's Developer site for a Sample project called Doc Interaction. It's chock full of of file/url handling goodness.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.