如何用新的viewController取代目前的viewController(How to repl

2019-06-27 04:18发布

我试图用一个新的来取代我目前的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和导航栏上有两个文本层。

如果我这样做:

[tempNavigationController pushViewController:viewController animated:FALSE];

我得到BAD_ACCESS和应用chrashes。 这之前,但没有奏效了。

我究竟做错了什么?

谢谢!

Answer 1:

使用类别控制器取代:

//  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


文章来源: How to replace current viewController with a new viewController