Iphone 刷新UINavigationController?

Iphone 刷新UINavigationController?,iphone,uinavigationcontroller,Iphone,Uinavigationcontroller,我有一个UINavigationController,堆栈上有两个viewcontroller。在程序执行的某个时刻,第二个视图控制器在屏幕上可见,此时,我想用另一个视图控制器替换该视图控制器。但是,它不起作用。这是我的密码: UINavigationController * thisNavController = self.waitingController; // remove the Dummy and set the new page instead NSMutableArray *

我有一个
UINavigationController
,堆栈上有两个
viewcontroller
。在程序执行的某个时刻,第二个视图控制器在屏幕上可见,此时,我想用另一个视图控制器替换该视图控制器。但是,它不起作用。这是我的密码:

UINavigationController * thisNavController = self.waitingController;

// remove the Dummy and set the new page instead
NSMutableArray * newControllers = [NSMutableArray arrayWithArray: thisNavController.viewControllers];
[newControllers replaceObjectAtIndex: ([thisNavController.viewControllers count] - 1) withObject: page];
NSLog (@"visible before: %@", [thisNavController.visibleViewController description]);
[thisNavController setViewControllers: [NSArray arrayWithArray: newControllers] animated: YES];
NSLog (@"visible after: %@", [thisNavController.visibleViewController description]);
[thisNavController.visibleViewController.view setNeedsDisplay];
上述代码生成此输出:

2011-05-05 13:30:22.201 myApp[3286:207] visible before: <DummyViewController: 0x4c8b4c0>
2011-05-05 13:30:22.209 myApp[3286:207] visible after: <RealViewController: 0x60173f0>
2011-05-05 13:30:22.201 myApp[3286:207]在以下时间之前可见:
2011-05-05 13:30:22.209 myApp[3286:207]在以下时间后可见:
但屏幕上显示的内容不会改变。切换选项卡后,似乎一切正常,因此这似乎是一个重绘问题,但setNeedsDisplay什么也不做,而且我找不到一个方法告诉
NavigationController
ViewController
已更改


是否有一些刷新机制,我必须触发刷新屏幕

一种解决方案是,在应用程序启动时添加2个(初始)视图控制器,并且只允许从第2个和第3个视图控制器进行导航,返回到所述senario中的第一个(根)视图控制器。您决不允许导航回此第一视图控制器或从此第一视图控制器导航到第二视图控制器;你可以在苹果的一些应用程序中看到这种行为,比如iTunes和Remote——如果没有网络连接,应用程序会立即显示一个无网络连接视图

因此,当您要显示上面的第一视图控制器时,可以执行以下操作:

NSArray *array = [navigationController popToRootViewControllerAnimated:NO];
如果没有更多关于你的应用程序导航行为的信息,我希望这会有所帮助


或者显示一个?

一个解决方案是在应用程序启动时添加2个(初始)视图控制器,并且只允许从第2个和第3个视图控制器进行导航,返回到所述senario中的第一个(根)视图控制器。您决不允许导航回此第一视图控制器或从此第一视图控制器导航到第二视图控制器;你可以在苹果的一些应用程序中看到这种行为,比如iTunes和Remote——如果没有网络连接,应用程序会立即显示一个无网络连接视图

因此,当您要显示上面的第一视图控制器时,可以执行以下操作:

NSArray *array = [navigationController popToRootViewControllerAnimated:NO];
如果没有更多关于你的应用程序导航行为的信息,我希望这会有所帮助


或者显示?

问题是,在虚拟控制器的初始转换动画完成之前,我试图替换视图控制器堆栈。这可以通过以下方式防止

首先,保留(最终)代理,将当前对象设置为代理,设置动画正在进行的标志,并按下新控制器:

self.oldNavigationControllerDelegate = self.waitingController.navigationController.delegate;
self.waitingController.navigationController.delegate = self;
self.isAnimating = YES;
[viewController.navigationController pushViewController: [[DummyViewController alloc] init] animated: YES];
然后,实现UIViewControllerDelegate协议方法,如下所示:

#pragma mark -
#pragma mark UINavigationControllerDelegate methods

- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController)
        self.isAnimating = YES;
}

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController) {
        self.isAnimating = NO;
        if (self.readyPage != nil)
            [self pageIsReady: self.readyPage]; // method to load the ready controller
    }
}
之后,每当内容/控制器/下载/任何内容准备就绪时,请确保导航控制器不再设置动画。如果是,则设置页面已就绪的标志。如果不是,请加载页面:

if (self.isAnimating)
    self.readyPage = controller;
else
    [self pageIsReady: controller];
当然,还要实现新堆栈的实际加载(与往常一样):


这让每个人都很高兴:p

问题是,我试图在虚拟控制器的初始过渡动画完成之前替换视图控制器堆栈。这可以通过以下方式防止

首先,保留(最终)代理,将当前对象设置为代理,设置动画正在进行的标志,并按下新控制器:

self.oldNavigationControllerDelegate = self.waitingController.navigationController.delegate;
self.waitingController.navigationController.delegate = self;
self.isAnimating = YES;
[viewController.navigationController pushViewController: [[DummyViewController alloc] init] animated: YES];
然后,实现UIViewControllerDelegate协议方法,如下所示:

#pragma mark -
#pragma mark UINavigationControllerDelegate methods

- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController)
        self.isAnimating = YES;
}

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController) {
        self.isAnimating = NO;
        if (self.readyPage != nil)
            [self pageIsReady: self.readyPage]; // method to load the ready controller
    }
}
之后,每当内容/控制器/下载/任何内容准备就绪时,请确保导航控制器不再设置动画。如果是,则设置页面已就绪的标志。如果不是,请加载页面:

if (self.isAnimating)
    self.readyPage = controller;
else
    [self pageIsReady: controller];
当然,还要实现新堆栈的实际加载(与往常一样):


这让每个人都很高兴:p

谢谢你的回答。这似乎是一个非常好的方法!我将来会考虑的。不过,这并不能解决我的问题——我找到了一个不同的解决方案,我会在我从愚蠢中恢复过来后发布……谢谢你的回答。这似乎是一个非常好的方法!我将来会考虑的。不过,这并不能解决我的问题——我找到了一个不同的解决方案,等我从愚蠢中恢复过来后,我会发布这个解决方案。。。