刷新 UINavigationController 堆栈中的视图

Posted

技术标签:

【中文标题】刷新 UINavigationController 堆栈中的视图【英文标题】:Refresh a view in UINavigationController Stack 【发布时间】:2012-12-12 11:27:42 【问题描述】:

我目前正在 viewDidLoad 方法中构建我的视图,它添加了各种链接到另一个视图的按钮。我遇到的问题是,当用户单击一个按钮并进入另一个视图时,他们可以购买 IAP,然后当用户单击后退按钮时,我希望视图“刷新”以显示此购买现在已经活跃起来了。

如何刷新视图?

提前致谢

【问题讨论】:

也许viewWillAppear ? 这似乎只是在前一个视图之上构建了我的视图,所以我得到了两倍? 在 viewWillAppear 方法中,只需运行检查是否已购买的方法,以便更改按钮的文本。您如何检查以确认是否已完成购买? 【参考方案1】:

可以通过在该视图上调用 setNeedsDisplay 来显式刷新任何视图。 此外,您不应将术语 UIViewControllerUIView 混淆。 我假设你没有刷新问题,你只会在自编程的自定义视图中。我预计相关视图的数据没有更新。

【讨论】:

这个好像不行,我在view中调用了这个方法会出现这样的方法:[self.view setNeedsDisplay]; 我认为您的其中一个子视图需要刷新。在 viewWillAppear 中调用 needsDisplay 是没有意义的。但我认为您的问题不是由刷新问题引起的,可能您的数据没有更新。 我已确保我的数据在 viewWillAppear 中刷新。基本上我现在需要刷新按钮视图,以便显示手表而不是购买它。我将如何刷新子视图? 在添加子视图之前,将它们存储在属性或字段中,然后您可以随时访问和刷新它们。另一种分配 view.tag = 101 。每个子视图一个不同的标签,然后你可以通过标签得到一个子视图,并刷新它 好的,这确实有道理,但是,我将这段代码放在哪里,目前我有 viewDidLoad 方法,如果我将所有代码放在第一次加载视图时显然会调用它viewWillAppear 方法它保留了原始视图,但在顶部添加了一个新集合,这在逻辑上确实有意义,但在这种情况下它让我发疯,感谢您对此的帮助和耐心。【参考方案2】:

您有几个选择。要么存储是否进行了购买,然后在您希望更改的视图的 viewWillAppear 方法中运行检查是否进行了购买的方法

或者... 设置一个委托回调,当购买页面上发生更改时更改按钮 (http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-custom-delegates/)

或者... 通过从 navigationController 堆栈访问前一个视图直接操作它 ([[self.navigationController viewControllers]objectAtIndex:YOURVIEW])

【讨论】:

【参考方案3】:

viewDidLoad 中构建视图,因此您只需添加一次控件,但在viewWillShow 中刷新。请记住,viewWillShow 将在viewDidLoad 完成构建后立即刷新它。因此,将定义控件外观的值保留在第一个 viewController 上,例如,在委托可变数组中

例如在您的 AppDelegate.h 和 .m

中创建并启动 NSMutableArray

在.h界面中

NSMutableArray *yourArray;

添加属性

@property (retain, nonatomic) NSMutableArray *yourArray;

在.m

@synthesyze yourArray;

在 .m 中启动它

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

yourArray=[[NSMutableArray alloc]init];

//add initial objects to it as many as you have controls

在第一viewController

#import "AppDelegate.h"

-(void)viewWillShow:(BOOL)animated

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

//pull objects from array and apply to your controls, say you have a string as a 1st obj

NSString *tmpStr=[appDelegate.yourArray objectAtIndex:0];//use it some where, say button's title

//etc

您将根据用户的选择在第二个viewController 中更改这些值

#import "AppDelegate.h"

在第二个viewController 的某处,yourArray 中的代码更新值在

上说
-(void)viewWillDisappear:(BOOL)animated

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

//run a loop and update all objects

[appDelegate.yourArray replaceObjectAtIndex:i withObject:newObj];

当您返回第一个viewController 时,viewWillShow 将从您的委托数组中刷新它们。

【讨论】:

以上是关于刷新 UINavigationController 堆栈中的视图的主要内容,如果未能解决你的问题,请参考以下文章

UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效

iOS 从某个页面返回然后刷新当前页面

类似刷新微博后,顶部显示更新数量的动画。

iOS:如何在弹出其子 UIViewController 后“刷新” UIViewController?

在导航栏中按下后退按钮时刷新 RootViewController 的内容

关闭 UINavigationController 并呈现另一个 UINavigationController