刷新 UINavigationController 堆栈中的视图
Posted
技术标签:
【中文标题】刷新 UINavigationController 堆栈中的视图【英文标题】:Refresh a view in UINavigationController Stack 【发布时间】:2012-12-12 11:27:42 【问题描述】:我目前正在 viewDidLoad 方法中构建我的视图,它添加了各种链接到另一个视图的按钮。我遇到的问题是,当用户单击一个按钮并进入另一个视图时,他们可以购买 IAP,然后当用户单击后退按钮时,我希望视图“刷新”以显示此购买现在已经活跃起来了。
如何刷新视图?
提前致谢
【问题讨论】:
也许viewWillAppear
?
这似乎只是在前一个视图之上构建了我的视图,所以我得到了两倍?
在 viewWillAppear 方法中,只需运行检查是否已购买的方法,以便更改按钮的文本。您如何检查以确认是否已完成购买?
【参考方案1】:
可以通过在该视图上调用 setNeedsDisplay
来显式刷新任何视图。
此外,您不应将术语 UIViewController
与 UIView
混淆。
我假设你没有刷新问题,你只会在自编程的自定义视图中。我预计相关视图的数据没有更新。
【讨论】:
这个好像不行,我在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:如何在弹出其子 UIViewController 后“刷新” UIViewController?