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

iphonedude2008

macrumors 65816
Original poster
Nov 7, 2009
1,134
450
Irvine, CA
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.