更新可变阵列

时间:2012-09-06 19:26:33

标签: ios nsmutablearray uitableview

我在Tableview中有一个可变数组,这是在从SQLite数据库加载的View中填充的,但是这个数据库会更改,因为它是我应用中产品的收藏夹数据库。 当用户选择tableview中的一个项目(然后用户使用数据库中的信息进入详细视图)时,用户可以选择将其从收藏夹(数据库)中删除,然后用户再按下导航栏,该项目仍然存在,我已经尝试了tableview重新加载视图确实出现,并且会出现视图,但这没有帮助,

任何人都可以对此有所了解吗?

非常感谢, 安德鲁

这是我的代码: FavTableViewController.h:

@interface FavTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
IBOutlet UITableView *Table; 
}
@property (nonatomic, strong) UITableView *Table;
@property (nonatomic, strong) NSArray *cats;
@property (nonatomic, strong) IBOutlet UISearchBar *searchBar;
@property (nonatomic, strong) UISearchDisplayController *searchDisplayController;
@property (nonatomic, strong) NSMutableArray *filteredListContent;
@property (nonatomic, strong) NSMutableArray *listContent;
@property (nonatomic, strong) NSArray *everything;
@property (nonatomic, copy) NSString *savedSearchTerm;
@property (nonatomic) NSInteger savedScopeButtonIndex;
@property (nonatomic) BOOL searchWasActive;
@property (nonatomic, strong) NSString *cellText;
-(void) refresh;
@end

FavTableViewController.m:

#import "FavTableViewController.h"
#import "DBFavAdapter.h"
#import "MenuData.h"
#import "DBAdapter.h"
#import "DetailViewController.h"
#import "ConsoleDetailController.h"
#import "EffectDetailViewController.h"
#import "DimmersDetailController.h"
#import "ConventionalController.h"
#import "ProDetailViewController.h"


@implementation FavTableViewController

@synthesize filteredListContent, savedSearchTerm, savedScopeButtonIndex, searchWasActive, searchBar, searchDisplayController, listContent, everything, cellText, cats, Table;

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    listContent = [[NSMutableArray alloc] init];
}
return self;
}

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
NSLog(@"Did Load");
[super viewDidLoad];

everything = [[DBFavAdapter allProducts] mutableCopy];
for (NSDictionary *dict in everything) {
    [listContent addObject: [dict objectForKey:@"Title"]];
}



// create a filtered list that will contain products for the search results table.

self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.listContent count]];

// restore search settings if they were saved in didReceiveMemoryWarning.
if (self.savedSearchTerm)
{
    [self.searchDisplayController setActive:self.searchWasActive];
    [self.searchDisplayController.searchBar setSelectedScopeButtonIndex:self.savedScopeButtonIndex];
    [self.searchDisplayController.searchBar setText:savedSearchTerm];

    self.savedSearchTerm = nil;
}
//  [self.tableView reloadData];
self.Table.scrollEnabled = YES;
self.navigationItem.title = @"Favourites";
//  cats = [DBFavAdapter allCategories];
}

- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.filteredListContent = nil;
NSLog(@"Unload");
}

- (void)viewWillAppear:(BOOL)animated {
NSLog(@"View will Appear");

[Table reloadData];
NSLog(@"Everything: %@",everything);
NSLog(@"list Content: %@",listContent);
[super viewWillAppear:animated];  
}

- (void)viewDidAppear:(BOOL)animated {
NSLog(@"View did Appear");
[super viewDidAppear:animated];
NSLog(@"list Content appeared: %@",listContent);
[Table reloadData];
}

- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"Did dissapear");
// save the state of the search UI so that it can be restored if the view is re-created
self.searchWasActive = [self.searchDisplayController isActive];
self.savedSearchTerm = [self.searchDisplayController.searchBar text];
self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(tableView == self.searchDisplayController.searchResultsTableView){
    return [self.filteredListContent count];
}
else {
    return [self.listContent count];
}
NSLog(@"Rows %i",[self.listContent count]);
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {    
//    NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
if (tableView == searchDisplayController.searchResultsTableView)
{
    cellText = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
    cellText = [self.listContent objectAtIndex:indexPath.row];
}


// NSString *cellText = [self.listContent objectAtIndex:indexPath.row];
UIFont *cellFont = [UIFont fontWithName:@"Heiti TC" size:17.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

return labelSize.height + 30;
}
- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = 1;
return row;
}

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Heiti TC" size:17.0];
}

// Configure the cell...
if (tableView == searchDisplayController.searchResultsTableView)
{
    cell.textLabel.text = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
    cell.textLabel.text = [self.listContent objectAtIndex:indexPath.row];
}

return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *selectedItem;

if (tableView == self.searchDisplayController.searchResultsTableView)
{
    selectedItem = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
    selectedItem = [self.listContent objectAtIndex:indexPath.row];
}

// Is the selection a category?
//    NSArray *cats = [DBAdapter allCategories];
__block BOOL cat = NO;
[cats enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([(NSString*)obj isEqualToString:selectedItem]) {
        cat = YES;
        *stop = YES;
    }
}];

if (cat) { // the user's selection was a category
//      NSLog(@"Selected item was a category");
}
else {
    NSArray *mans = [DBAdapter allManufacturers];
    __block BOOL man = NO;
    [mans enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([(NSString*)obj isEqualToString:selectedItem]) {
            man = YES;
            *stop = YES;
        }
    }];
    if (man) { // the user's selection was a manufacturer
//        NSLog(@"Selected item was a manufacturer");
    } else {
        // the user's selection was a product

        // Find selectedItem in products
        __block NSDictionary *selectedRow = nil;
        [self.everything enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
            //everything is an array of dictionaries 
            if ([(NSString*)[(NSDictionary*)obj objectForKey:@"Title"] isEqualToString:selectedItem]) {
                selectedRow = (NSDictionary*)obj;
                *stop = YES;
            }
        }];

        MenuData *selectionData =  [MenuData menuData];
        selectionData.manufacturerID = [[selectedRow objectForKey:@"Manufacturer_id"] integerValue];
        selectionData.categoryID = [[selectedRow objectForKey:@"Category_id"] integerValue];
        selectionData.sCategoryID = [[selectedRow objectForKey:@"SubCategory_id"] integerValue];
        selectionData.ssCategoryID = [[selectedRow objectForKey:@"SuperSubCategory_id"] integerValue];

        NSString *selectedTitle = [selectedRow objectForKey: @"Title"];  // You probably already have this value from your search. Here for the sake of clarity.

        NSDictionary *productDetails = [DBAdapter productDetails: selectedTitle forCurrentData: selectionData];


        NSArray *allKeys = [productDetails allKeys];
//        NSLog(@"values: %i", [allKeys count]);
        for (NSString *key in allKeys) {
            id value = [productDetails objectForKey:key];
            if ([value isKindOfClass:[NSString class]]) {
          //      NSLog(@"key: %@  value: %@", key, value); 
            }
        }

        NSInteger ViewNumber = [[productDetails objectForKey:@"View"] integerValue];
        switch (ViewNumber) {
            case 25: {
                DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
                dvController.dictionary = productDetails;
                [self.navigationController pushViewController:dvController animated:YES];
            }
                break;
            case 18: {
                EffectDetailViewController *edvController = [[EffectDetailViewController alloc] initWithNibName:@"EffectDetailView" bundle:[NSBundle mainBundle]];
                edvController.dictionary = productDetails;
                [self.navigationController pushViewController:edvController animated:YES];
            }
                break;
            case 17: {
                ConsoleDetailController *cdvController = [[ConsoleDetailController alloc] initWithNibName:@"ConsoleDetailController" bundle:[NSBundle mainBundle]];
                cdvController.dictionary = productDetails;
                [self.navigationController pushViewController:cdvController animated:YES];
            }
                break;
            case 2: {
                ConsoleDetailController *cdvController = [[ConsoleDetailController alloc] initWithNibName:@"ConsoleDetailController" bundle:[NSBundle mainBundle]];
                cdvController.dictionary = productDetails;
                [self.navigationController pushViewController:cdvController animated:YES];
            }
                break;
            case 3: {
                DimmersDetailController *ddvController = [[DimmersDetailController alloc] initWithNibName:@"DimmersDetailController" bundle:[NSBundle mainBundle]];
                ddvController.dictionary = productDetails;
                [self.navigationController pushViewController:ddvController animated:YES];
            }
                break;
            case 12: {
                ConventionalController *cController = [[ConventionalController alloc] initWithNibName:@"ConventionalController" bundle:[NSBundle mainBundle]];
                cController.dictionary = productDetails;
                [self.navigationController pushViewController:cController animated:YES];
            }
                break;
            case 5: {
                ProDetailViewController *pController = [[ProDetailViewController alloc] initWithNibName:@"ProDetailViewController" bundle:[NSBundle mainBundle]];
                pController.dictionary = productDetails;
                [self.navigationController pushViewController:pController animated:YES];
            }
                break;

        }


    }
}

}

#pragma mark -
#pragma mark Content Filtering

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
/*
 Update the filtered array based on the search text and scope.
 */

[self.filteredListContent removeAllObjects]; // First clear the filtered array.

/*
 Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array.
 */
for (NSString *product in listContent)
{
    //Edit AD - NS Range works instead of NSComparisonResult
    NSRange result = [product rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)];
    if (result.location != NSNotFound)
    {
        [self.filteredListContent addObject:product];
    }
    /*
     //  NSComparisonResult result = [product compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
     if (result == NSOrderedSame)
     {
     [self.filteredListContent addObject:product];
     }
     */
}
}

#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self filterContentForSearchText:searchString scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

// Return YES to cause the search result table view to be reloaded.
return YES;
}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

// Return YES to cause the search result table view to be reloaded.
return YES;
}


- (void)refresh {
NSLog(@"Refresh");
if([NSThread isMainThread])
{
    [self.Table reloadData];
    [self.Table setNeedsLayout];
    [self.Table setNeedsDisplay];
}
else
{
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:YES];
}
}

@end

1 个答案:

答案 0 :(得分:2)

您有2个选项。

  1. 同时从listContent中删除该项目。这可以通过delegate方法完成,当您删除项目时,该方法将从子视图控制器调用。
  2. 将您生成viewDidLoad的{​​{1}}功能从数据库移至listContents。这将导致viewWillAppear再次读取数据库,在删除项目后按下后退按钮,这将在视图首次打开时被调用。