2011-09-29 113 views
0

我有這個問題,瞭解如何保存數據,以便爲我的應用程序添加「添加到收藏夾」功能。 該應用程序有一個UITableView,數據存儲在Plist中。從 它進入包含UIImageView和UITextView的DetailView。 我希望能夠將我喜歡的項目加入書籤,並在 分開的視圖中顯示它們。添加到收藏夾功能?

以下是一段代碼,使其更容易地看到:

//BooksLibraryDao.h 

#import <Foundation/Foundation.h> 


@interface BooksLibraryDao : NSObject { 
    NSString *libraryPlist; 
    NSArray *libraryContent; 
} 

@property (nonatomic, readonly) NSString *libraryPlist; 
@property (nonatomic, readonly) NSArray *libraryContent; 

- (id)initWithLibraryName:(NSString *)libraryName; 
- (NSDictionary *)libraryItemAtIndex:(int)index; 
- (int)libraryCount; 

@end 


//BooksLibraryDao.m 

#import "BooksLibraryDao.h" 


@implementation BooksLibraryDao 

@synthesize libraryContent, libraryPlist; 

- (id)initWithLibraryName:(NSString *)libraryName { 
    if (self = [super init]) { 
     libraryPlist = libraryName; 
     libraryContent = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] 
                    pathForResource:libraryPlist ofType:@"plist"]]; 
    } 
    return self; 
} 

- (NSDictionary *)libraryItemAtIndex:(int)index { 
    return (libraryContent != nil && [libraryContent count] > 0 && index < [libraryContent count]) 
     ? [libraryContent objectAtIndex:index] 
     : nil; 
} 

- (int)libraryCount { 
    return (libraryContent != nil) ? [libraryContent count] : 0; 
} 

- (void) dealloc { 
    if (libraryContent) [libraryContent release]; 
    [super dealloc]; 
} 


@end 


//BooksTableViewController.h 

#import <UIKit/UIKit.h> 
#import "BooksLibraryDao.h" 
#import "BooksListingViewCell.h" 
#import "BooksAppDelegate.h" 


@interface BooksTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> { 
    IBOutlet UITableView *booksTableView; 
    BooksLibraryDao *dao; 

    IBOutlet BooksListingViewCell *_cell; 
} 


@end 



//BooksTableViewController.m 

#import "BooksTableViewController.h" 
#import "DetailViewController.h" 
#import "BooksListingViewCell.h" 
#import "BooksNavController.h" 

@implementation BooksTableViewController 
#define CELL_HEIGHT 70.0 

#pragma mark - 
#pragma mark Initialization 

/* 
- (id)initWithStyle:(UITableViewStyle)style { 
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization. 
    } 
    return self; 
} 
*/ 


#pragma mark - 
#pragma mark View lifecycle 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView.backgroundColor = [UIColor clearColor]; 
} 


- (void)viewWillAppear:(BOOL)animated { 
    dao = [[BooksLibraryDao alloc] initWithLibraryName:@"TestData"]; 
    self.title = @"Books"; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

#pragma mark - 
#pragma mark Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [dao libraryCount]; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"LibraryListingCell"; 

    BooksListingViewCell *cell = (BooksListingViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"BooksListingView" owner:self options:nil]; 
     cell = [_cell autorelease]; 
     _cell = nil; 
    } 

    cell.titleLabel.text = [[dao libraryItemAtIndex:indexPath.row] valueForKey:@"title"];  
    cell.smallImageView.image = [UIImage imageNamed:[[dao libraryItemAtIndex:indexPath.row] valueForKey:@"smallImage"]];  
    cell.backgroundColor = [UIColor colorWithRed:9 green:9 blue:9 alpha:.7]; 
    cell.textLabel.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.textColor = [UIColor colorWithRed:.1 green:.1 blue:.1 alpha:1]; 
    cell.selectedBackgroundView = [[[UIImageView alloc] init] autorelease]; 
    UIImage *selectionBackground; 
    selectionBackground = [UIImage imageNamed:@"cell.png"]; 
    ((UIImageView *)cell.selectedBackgroundView).image = selectionBackground; 
    return cell; 

} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DetailViewController *controller = [[DetailViewController alloc] 
             initWithBookData:[dao libraryItemAtIndex:indexPath.row] 
             nibName:@"DetailViewController" bundle:[NSBundle mainBundle]]; 
    controller.title = [[dao libraryItemAtIndex:indexPath.row] valueForKey:@"title"]; 
    [self.navigationController pushViewController:controller animated:YES]; 
    [controller release]; 

} 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return CELL_HEIGHT; 
} 


#pragma mark - 
#pragma mark Table view delegate 


#pragma mark - 
#pragma mark Memory management 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Relinquish ownership any cached data, images, etc. that aren't in use. 
} 

- (void)viewDidUnload { 
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 


@end 


//DetailViewController.h 


#import <UIKit/UIKit.h> 
#import <MessageUI/MessageUI.h> 
#import <MessageUI/MFMailComposeViewController.h> 
#import <QuartzCore/QuartzCore.h> 


@interface DetailViewController : UIViewController <MFMailComposeViewControllerDelegate>{ 
    IBOutlet UIImageView *bookImageView; 
    IBOutlet UILabel *titleLabel; 

    IBOutlet UITextView *authorTextView; 
    IBOutlet UITextView *descriptionTextView; 
    IBOutlet UILabel *message; 

    NSDictionary *bookData; 
} 

@property (nonatomic, retain) UIImageView *bookImageView; 
@property (nonatomic, retain) UILabel *titleLabel; 

@property (nonatomic, retain) UITextView *descriptionTextView; 
@property (nonatomic, retain) UITextView *authorTextView; 
@property (nonatomic, retain) IBOutlet UILabel *message; 


-(IBAction)showPicker:(id)sender; 
-(void)displayComposerSheet; 
-(void)launchMailAppOnDevice; 
-(IBAction)showAuthor; 
-(IBAction)showDesc; 
-(IBAction)showImage; 

- (id)initWithBookData:(NSDictionary *)data nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 

@end 



//DetailViewController.m 

#import "DetailViewController.h" 



@implementation DetailViewController 

@synthesize bookImageView, titleLabel, descriptionTextView, authorTextView; 
@synthesize message; 

- (id)initWithBookData:(NSDictionary *)data nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     bookData = data; 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    bookImageView.image = [UIImage imageNamed:[bookData valueForKey:@"bookImage"]]; 
    titleLabel.text = [bookData valueForKey:@"title"]; 
    descriptionTextView.text = [bookData valueForKey:@"description"]; 
    authorTextView.text = [bookData valueForKey:@"author"]; 
    [super viewDidLoad]; 
} 
+0

歡迎來到SO!有關發佈人們可以回答的問題的幾條提示。確切地說明你的問題是什麼,並且你想讓人們很容易看到問題並作出迴應。在這個特殊情況下,這只是太多的代碼讓人們參與進來,而且你還沒有清楚你已經嘗試了什麼以及它失敗了。把它修剪成問題的核心,你會得到更好的答案。 –

+0

您要求StackOverflow用戶將功能添加到您的應用程序併爲您編寫代碼。請閱讀關於如何提問的建議,特別是「做家庭作業」和「提出與其他用戶相關的問題」部分的建議。 –

+0

我很抱歉,如果它出現這樣,我只是要求一些指針。 – ftwhere

回答

1

你已經得到了實現收藏夾幾個選項(實際上大多取決於你的數據是否具有持久性)之一。

  • (A)您可以添加標記爲您在表中顯示,這標誌着它作爲一個最喜歡的每個項目, - 然後就指的是相同的數據集 但過濾它說標記。還是......

  • (B)您可以創建一個額外表保持每個項目的副本 要標記爲收藏,則指的是新的列表作爲 您的數據源。

如果你的數據不是持久的,你仍然可以使用方法A和插入新的,新的數據之前,當數據被刷新,只保留了標記的記錄。

希望是有道理的!

+0

謝謝,它讓我更容易理解我必須做的事情。我會盡力看看我能做些什麼:) – ftwhere