2011-01-06 89 views
0

我正在開發一個簡單的iOS應用,其中有一些類別(CategoryViewController)的表視圖。 當點擊這個類別中的視圖將被傳遞到與食譜另一個表視圖RecipesListController之一。這個食譜是根據點擊的類別從不同的plist中加載的。的iOS的TableView崩潰加載不同的數據

我第一次點擊某個類別,配方列表加載和顯示correctely。如果我回到類別列表並單擊任何類別(也是相同的)應用程序崩潰。我不知道如何。 viewWillAppear正確地被收回,但是在崩潰之後。

你能幫我嗎? 如果您需要整個項目,我可以爲您壓縮。好?

此處是CategoryViewController.h

#import <Foundation/Foundation.h> 
#import "RecipeRowViewController.h" 

@class RecipesListController; 

@interface CategoryViewController : UITableViewController { 

    NSArray *recipeCategories; 
    RecipesListController *childController; 
} 

@property (nonatomic, retain) NSArray *recipeCategories; 

@end 

代碼中的CategoryViewControoler.m

#import "CategoryViewCotroller.h" 
#import "NavAppDelegate.h" 
#import "RecipesListController.h" 


@implementation CategoryViewController 

@synthesize recipeCategories; 



- (void)viewDidLoad { 

    // Create the categories 
    NSArray *array = [[NSArray alloc] initWithObjects:@"Antipasti", @"Focacce", @"Primi", @"Secondi", @"Contorni", @"Dolci", nil]; 
    self.recipeCategories = array; 
    [array release]; 

    // Set background image 
    UIImageView *bgImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sfondo_app.png"]]; 
    [self.tableView setBackgroundView:bgImg]; 
    [bgImg release]; 

    [self.tableView reloadData]; 
    [super viewDidLoad]; 
} 



- (void)viewDidUnload { 

    self.recipeCategories = nil; 
// [childController release]; 
    [super viewDidUnload]; 
} 



- (void)dealloc { 

    [recipeCategories release]; 
// [childController release]; 
    [super dealloc]; 
} 




#pragma mark - 
#pragma mark Table data source methods 

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

    return [recipeCategories count]; 
} 



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellId = @"RecipesCategoriesCellId"; 

    // Try to reuse a cell or create a new one 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId]; 
    if (cell == nil) { 

     cell = [[[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:CellId] autorelease]; 
    } 

    // Get the right value and assign to the cell 
    NSUInteger row = [indexPath row]; 
    NSString *rowString = [recipeCategories objectAtIndex:row]; 
    cell.textLabel.text = rowString; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    [rowString release]; 

    return cell; 
} 



#pragma mark - 
#pragma mark Table view delegate methods 

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

    if (childController == nil) { 
     childController = [[RecipesListController alloc] initWithStyle:UITableViewStyleGrouped]; 
    } 

    childController.title = @"Ricette"; 
    childController.category = [indexPath row]; 

    [self.navigationController pushViewController:childController animated:YES]; 
} 



@end 

的RecipesListController.h

#import <Foundation/Foundation.h> 
#import "RecipeRowViewController.h" 

#define kRecipeArrayLink  0 
#define kRecipeArrayDifficulty 1 
#define kRecipeArrayFoodType 2 


#define kRecipeAntipasti 0 
#define kRecipeFocacce  1 
#define kRecipePrimi  2 
#define kRecipeSecondi  3 
#define kRecipeContorni  4 
#define kRecipeDolci  5 


@class DisclosureDetailController; 

@interface RecipesListController : UITableViewController { 

    NSInteger category; 
    NSDictionary *recipesArray; 
    NSArray *recipesNames; 
    NSArray *recipesLinks; 
    DisclosureDetailController *childController; 
} 

@property (nonatomic) NSInteger category; 
@property (nonatomic, retain) NSDictionary *recipesArray; 
@property (nonatomic, retain) NSArray *recipesNames; 
@property (nonatomic, retain) NSArray *recipesLinks; 

@end 

的RecipesListcontroller.m

#import "RecipesListController.h" 
#import "NavAppDelegate.h" 
#import "DisclosureDetailController.h" 


@implementation RecipesListController 

@synthesize category, recipesArray, recipesNames, recipesLinks; 



- (void)viewDidLoad { 

    // Set background image 
    UIImageView *bgImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sfondo_app.png"]]; 
    [self.tableView setBackgroundView:bgImg]; 
    [bgImg release]; 

    [self.tableView reloadData]; 

    [super viewDidLoad]; 
} 



- (void)viewWillAppear:(BOOL)animated { 

    if (self.recipesArray != nil) { 

     // Release the arrays 
     [self.recipesArray release]; 
     [self.recipesNames release]; 
    } 

    // Load the dictionary 
    NSString *path = nil; 

    // Load a different dictionary, based on the category 
    if (self.category == kRecipeAntipasti) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_antipasti" ofType:@"plist"]; 

    } else if (self.category == kRecipeFocacce) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_focacce" ofType:@"plist"]; 

    } else if (self.category == kRecipePrimi) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_primi" ofType:@"plist"]; 

    } else if (self.category == kRecipeSecondi) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_secondi" ofType:@"plist"]; 

    } else if (self.category == kRecipeContorni) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_contorni" ofType:@"plist"]; 

    } else if (self.category == kRecipeDolci) { 
     path = [[NSBundle mainBundle] pathForResource:@"recipes_dolci" ofType:@"plist"]; 
    } 

    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    self.recipesArray = dict; 
    [dict release]; 

    // Save recipes names 
    NSArray *array = [[recipesArray allKeys] sortedArrayUsingSelector: 
         @selector(compare:)]; 
    self.recipesNames = array; 

    [self.tableView reloadData]; 
    [super viewWillAppear:animated]; 
} 


- (void)viewDidUnload { 

    self.recipesArray = nil; 
    self.recipesNames = nil; 
    self.recipesLinks = nil; 
// [childController release]; 
    [super viewDidUnload]; 
} 



- (void)dealloc { 

    [recipesArray release]; 
    [recipesNames release]; 
    [recipesLinks release]; 
// [childController release]; 
    [super dealloc]; 
} 




#pragma mark - 
#pragma mark Table data source methods 

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

    return [recipesNames count]; 
} 



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *RecipesListCellId = @"RecipesListCellId"; 

    // Try to reuse a cell or create a new one 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RecipesListCellId]; 
    if (cell == nil) { 

     cell = [[[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:RecipesListCellId] autorelease]; 
    } 

    // Get the right value and assign to the cell 
    NSUInteger row = [indexPath row]; 
    NSString *rowString = [recipesNames objectAtIndex:row]; 
    cell.textLabel.text = rowString; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    [rowString release]; 

    return cell; 
} 



#pragma mark - 
#pragma mark Table view delegate methods 

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

    if (childController == nil) { 
     childController = [[DisclosureDetailController alloc] initWithNibName:@"DisclosureDetail" bundle:nil]; 
    } 

    childController.title = @"Dettagli"; 
    NSUInteger row = [indexPath row]; 

    childController.recipeName = [recipesNames objectAtIndex:row]; 

    NSArray *recipeRawArray = [recipesArray objectForKey:childController.recipeName]; 
    childController.recipeLink = [recipeRawArray objectAtIndex:kRecipeArrayLink]; 
    childController.recipeDifficulty = [recipeRawArray objectAtIndex:kRecipeArrayDifficulty]; 

    [self.navigationController pushViewController:childController animated:YES]; 
} 



@end 

這是崩潰日誌

Program received signal: 「EXC_BAD_ACCESS」. 
(gdb) bt 
#0 0x00f0da63 in objc_msgSend() 
#1 0x04b27ca0 in ??() 
#2 0x00002665 in -[RecipesListController viewWillAppear:] (self=0x4b38a00, _cmd=0x6d81a2, animated=1 '\001') at /Users/claudiocanino/Documents/iOS/CottoMangiato/Classes/RecipesListController.m:67 
#3 0x00370c9a in -[UINavigationController _startTransition:fromViewController:toViewController:]() 
#4 0x0036b606 in -[UINavigationController _startDeferredTransitionIfNeeded]() 
#5 0x0037283e in -[UINavigationController pushViewController:transition:forceImmediate:]() 
#6 0x04f49549 in -[UINavigationControllerAccessibility(SafeCategory) pushViewController:transition:forceImmediate:]() 
#7 0x0036b4a0 in -[UINavigationController pushViewController:animated:]() 
#8 0x00003919 in -[CategoryViewController tableView:didSelectRowAtIndexPath:] (self=0x4b27ca0, _cmd=0x6d19e3, tableView=0x500c200, indexPath=0x4b2d650) at /Users/claudiocanino/Documents/iOS/CottoMangiato/Classes/CategoryViewCotroller.m:104 
#9 0x0032a794 in -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]() 
#10 0x00320d50 in -[UITableView _userSelectRowAtPendingSelectionIndexPath:]() 
#11 0x000337f6 in __NSFireDelayedPerform() 
#12 0x00d8cfe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#13 0x00d8e594 in __CFRunLoopDoTimer() 
#14 0x00ceacc9 in __CFRunLoopRun() 
#15 0x00cea240 in CFRunLoopRunSpecific() 
#16 0x00cea161 in CFRunLoopRunInMode() 
#17 0x016e0268 in GSEventRunModal() 
#18 0x016e032d in GSEventRun() 
#19 0x002c342e in UIApplicationMain() 
#20 0x00001c08 in main (argc=1, argv=0xbfffef58) at /Users/claudiocanino/Documents/iOS/CottoMangiato/main.m:15 

另一個BT日誌:

(gdb) bt 
#0 0x00cd76a1 in __CFBasicHashDeallocate() 
#1 0x00cc2bcb in _CFRelease() 
#2 0x00002dd6 in -[RecipesListController setRecipesArray:] (self=0x6834d50, _cmd=0x4293, _value=0x4e3bc70) at /Users/claudiocanino/Documents/iOS/CottoMangiato/Classes/RecipesListController.m:16 
#3 0x00002665 in -[RecipesListController viewWillAppear:] (self=0x6834d50, _cmd=0x6d81a2, animated=1 '\001') at /Users/claudiocanino/Documents/iOS/CottoMangiato/Classes/RecipesListController.m:67 
#4 0x00370c9a in -[UINavigationController _startTransition:fromViewController:toViewController:]() 
#5 0x0036b606 in -[UINavigationController _startDeferredTransitionIfNeeded]() 
#6 0x0037283e in -[UINavigationController pushViewController:transition:forceImmediate:]() 
#7 0x091ac549 in -[UINavigationControllerAccessibility(SafeCategory) pushViewController:transition:forceImmediate:]() 
#8 0x0036b4a0 in -[UINavigationController pushViewController:animated:]() 
#9 0x00003919 in -[CategoryViewController tableView:didSelectRowAtIndexPath:] (self=0x4b12970, _cmd=0x6d19e3, tableView=0x5014400, indexPath=0x4b2bd00) at /Users/claudiocanino/Documents/iOS/CottoMangiato/Classes/CategoryViewCotroller.m:104 
#10 0x0032a794 in -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]() 
#11 0x00320d50 in -[UITableView _userSelectRowAtPendingSelectionIndexPath:]() 
#12 0x000337f6 in __NSFireDelayedPerform() 
#13 0x00d8cfe3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#14 0x00d8e594 in __CFRunLoopDoTimer() 
#15 0x00ceacc9 in __CFRunLoopRun() 
#16 0x00cea240 in CFRunLoopRunSpecific() 
#17 0x00cea161 in CFRunLoopRunInMode() 
#18 0x016e0268 in GSEventRunModal() 
#19 0x016e032d in GSEventRun() 
#20 0x002c342e in UIApplicationMain() 
#21 0x00001c08 in main (argc=1, argv=0xbfffef58) at /Users/claudiocanino/Documents/iOS/CottoMangiato/main.m:15 

感謝

+0

什麼是你所得到的錯誤? – 2011-01-06 13:26:49

回答

2
// Get the right value and assign to the cell 

NSUInteger row = [dexPath row]in; 
NSString *rowString = [recipeCategories objectAtIndex:row]; 
cell.textLabel.text = rowString; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

[rowString release]; 

我只是在尋找線索,因爲我有一個非常類似的問題(我自己是一個初學者),但是當我看着你的代碼時,是否會發布rowstring a雖然你不擁有它? [recipeCategories objectAtIndex:row]不應該讓你對發佈負責,因爲沒有創建/分配/複製方法。