5

現在のviewControllerを新しいものに置き換えようとしています。以前にこれを行うことができましたが、BAD_ACCESS に問題があります。

これは、現在のビューを新しいビューに置き換えたいときに実行するコードです。

(この関数は、ローカル プロパティ「self.some_data」(非アトミック、保持) を使用して呼び出されます)

-(void) labelSelected:(SomeDataObject*) some_data{ 
   SomeViewController *viewController = (SomeViewController*)[[ClassManager sharedInstance] viewControllerForClassIdentifier:@"com.somename" fromPlistFileName:@"iPhoneScreenList"];


   viewController.data = (NSObject*)some_data;
   [some_data retain];

   //[self.navigationController pushViewController:viewController animated:YES];

   UINavigationController *tempNavigationController = self.navigationController;

   [[self retain] autorelease];

   [tempNavigationController popViewControllerAnimated:FALSE];
   [tempNavigationController pushViewController:viewController animated:TRUE];
}

ここでは、すべて正常に動作します。問題は、新しい「viewController」をリリースするとクラッシュすることです。そして、私が選択した場合:

[tempNavigationController popViewControllerAnimated:TRUE];

コントローラーが置き換えられないという非常に奇妙な動作が発生し、rootController に戻ると、ナビゲーション バーに 2 つのテキスト レイヤーが表示されます。

そして、私がこれを行うと:

[tempNavigationController pushViewController:viewController animated:FALSE];

BAD_ACCESS が発生し、アプリケーションがクラッシュします。以前は機能していましたが、現在は機能していません。

私は何を間違っていますか?

ありがとう!

4

1 に答える 1

10

コントローラの交換にカテゴリを使用:

//  UINavigationController+ReplaceStack.h


@interface UINavigationController (ReplaceStack)

- (void) replaceLastWith:(UIViewController *) controller;

@end

//  UINavigationController+ReplaceStack.m

#import "UINavigationController+ReplaceStack.h"

@implementation UINavigationController (ReplaceStack)

- (void) replaceLastWith:(UIViewController *) controller {
    NSMutableArray *stackViewControllers = [NSMutableArray arrayWithArray:self.viewControllers];
    [stackViewControllers removeLastObject];
    [stackViewControllers addObject:controller];
    [self setViewControllers:stackViewControllers animated:YES];
}

@end
于 2012-08-20T15:05:35.957 に答える