UIViewController屏幕上的当前需要通过设置徽标视图来响应来自APN的推送通知.但我怎么能得到UIViewControllerin方法application:didReceiveRemoteNotification:AppDelegate.m?
我尝试使用self.window.rootViewController获取当前显示UIViewController,它可能是一种UINavigationViewController或其他类型的视图控制器.我发现可以用来获取屏幕上的visibleViewController属性.但如果它不是,我该怎么办?UINavigationViewControllerUIViewControllerUINavigationViewController
任何帮助表示赞赏!相关代码如下.
AppDelegate.m
...
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//I would like to find out which view controller is on the screen here.
UIViewController *vc = [(UINavigationViewController *)self.window.rootViewController visibleViewController];
[vc performSelector:@selector(handleThePushNotification:) withObject:userInfo];
}
...
Run Code Online (Sandbox Code Playgroud)
ViewControllerA.m
- (void)handleThePushNotification:(NSDictionary *)userInfo{
//set some badge view here
}
Run Code Online (Sandbox Code Playgroud) 如果我推动视图控制器和/或提供模态视图控制器UINavigationController,我怎样才能找出最顶层的UIViewController?或者在我的情况下,我想知道某个UITableViewController是否是最重要的.
我试过用:
self.navigationController.topViewController == self
Run Code Online (Sandbox Code Playgroud)
......但这不起作用.我猜测它失败了,因为我在它上面呈现模态视图控制器,并且topViewController只跟踪推送了哪些视图UINavigationController(而不是那些以模态方式呈现的视图).
cocoa-touch objective-c uiviewcontroller uinavigationcontroller
我正在开发一个应用程序来处理来自网络的持续传入数据流,并为用户提供许多不同的UIView来查看该数据.
当某些模型数据根据来自网络的传入流进行更新时,我访问相关的UIViewController或UITableViewController,并在其上执行-setNeedsDisplay(在UIViewController的情况下)或-reloadData(在UITableViewController的情况下).
有没有办法检查当前是否正在显示给定的UIView(除了刚被加载)以便我只做--setNeedsDisplay或-reloadData如果用户当前正在查看该UIView?看起来在用户当前没有看到的视图上调用-setNeedsDisplay或reloadData会浪费处理能力,并且不利于电池寿命.当用户最终切换到之前已更新的视图时,在-viewWillAppear上执行-setNeedsDisplay或reloadData会更有意义.
谢谢
我创建了一个UIViewController子类,它可以在UINavigationController的导航堆栈中推送,也可以从任何UIViewController呈现(模态).我需要确定是否显示了我的视图控制器,如果显示,我需要在视图控制器的顶部添加一个带有关闭按钮的工具栏.(否则,如果将其推入导航堆栈,则会添加默认关闭按钮,使用该用户可以返回.)
在UIViewController子类内部的所有可用版本中说4.3,5.0到6.0,如果满足以下条件,我可以假设视图控制器是以模态方式呈现的.
if(self.parentViewController == nil || self.navigationController == nil)
Run Code Online (Sandbox Code Playgroud) 我正在使用应用程序内购买iPhone应用程序.我有一个充当SKProductsRequestDelegate和的类SKPaymentTransactionObserver,并且它在iTunes上当前发布的版本中都运行良好.
但是,在最近添加一个新的非消耗品并在Sandbox环境中进行测试之后,我现在遇到了一个奇怪的问题.每次我启动应用程序时,我昨天的购买重新出现在传递给我的交易列表中paymentQueue:updatedTransactions:,尽管事实上我已经打过电话[[SKPaymentQueue defaultQueue] finishTransaction:transaction](好几次).这是亡灵!
在我的paymentQueue:updatedTransactions:实施中,我有:
for (SKPaymentTransaction* transaction in transactions)
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
case SKPaymentTransactionStateRestored:
{
....
DDLog(@"Transaction for %@ occurred originally on %@.", transaction.payment.productIdentifier, transaction.originalTransaction.transactionDate);
....
Run Code Online (Sandbox Code Playgroud)
然后我处理购买,下载用户内容,最后,在另一种方法中,执行以下操作:
for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions])
if (([transaction.payment.productIdentifier isEqualToString:theParser.currentProductID]) &&
((transaction.transactionState==SKPaymentTransactionStatePurchased) || (transaction.transactionState==SKPaymentTransactionStateRestored))
)
{
DDLog(@"[[ Transaction will finish: product ID = %@; date = %@ ]]", transaction.payment.productIdentifier, transaction.transactionDate);
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,为了简单起见,我并没有坚持原始的事务对象,并且稍后从调用中找到它相对容易[[SKPaymentQueue defaultQueue] transactions].无论如何,我确实看到了预期的输出; 交易已完成,并且与产品ID和原始交易日期完全匹配.但是,下次我运行应用程序时,整个事情重新开始!就像iTunes …
注意:当我谈论App后端时,我不是指服务器后端.App后端是应用程序的一部分.它是应用程序的非ui部分.
我有一个代码设计问题.使用j2objc Java用作iOS应用程序的后端,前端仍然是Objective-C.
哪个部分(前端或后端)应控制此模型中的导航?
考虑以下.最初的ViewController已加载.用户点击了一个按钮.以下是两种可能的情况:
前端接收手势并打开请求的ViewController
前端接收手势并将动作报告给Java后端.Java后端决定下一个要打开的页面,并告诉前端要显示哪个ViewController.
对我来说,第二种解决方案在代码分离方面似乎更有意义.但是我遇到了一个问题.假设您的应用程序中有以下ViewController结构:
UIViewController主要: UINavigationViewControllerUIPageViewControllerUIPageViewControllerUIPageViewController设置: UIViewController如果您在应用程序的级别导航,则很简单.您只需告诉前端打开Startpage,Main或Settings.但是,有什么用途点击按钮从"起始页"或从Main> Main-TabPage1转到Main> Main-TabPage3.您必须执行以下操作:
你看到这样一个简单的页面方案的事件揭示了Java后端的ViewController似乎有很多需要考虑的案例.
这是从Java后端泄露视图的有效方式,还是看到更好的方法?
我需要在iOS应用程序中定期轮询来自服务器的数据.我需要在一个线程中每隔10秒执行一次,以保持UI可用.当用户登录时,将触发此函数.我正在考虑使用NSRunLoopwith NSTimer来实现此功能,并且可能用于AFNetworking获取JSON数据.
这是正确的方法吗?应该使用GCD吗?
我试图渲染MKMapView成一个UIImage,而不是在屏幕上显示它.我初始化地图:
let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))
mapView.delegate = self
let region = MKCoordinateRegionMakeWithDistance(location.coordinate(), 1000, 1000)
mapView.setRegion(region, animated: false)
Run Code Online (Sandbox Code Playgroud)
我也实现了MKMapKitDelegate这个方法mapViewDidFinishLoadingMap().除非我将地图添加到视图层次结构并使其可见,否则永远不会调用此方法.这意味着,其设置alpha为0,或isHidden到true不工作(在地图中没有加载在这种情况下).救命?
我需要检测前面的哪个视图(当前可见).我怎样才能做到这一点?
这是我想做的事情:
if ( ! <<methodToTellIfViewAIsInFront>>) {
[viewA prepareToDisplay];
[window bringSubviewToFront: viewA];
}
Run Code Online (Sandbox Code Playgroud) 有没有办法知道UIViewController是否已经以模态方式呈现和解散?
就像是:
谢谢