相关疑难解决方法(0)

在AppDelegate.m的屏幕上获取当前显示的UIViewController

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)

iphone uiviewcontroller push-notification ios

119
推荐指数
10
解决办法
17万
查看次数

获得最顶级的UIViewController

如果我推动视图控制器和/或提供模态视图控制器UINavigationController,我怎样才能找出最顶层的UIViewController?或者在我的情况下,我想知道某个UITableViewController是否是最重要的.

我试过用:

self.navigationController.topViewController == self
Run Code Online (Sandbox Code Playgroud)

......但这不起作用.我猜测它失败了,因为我在它上面呈现模态视图控制器,并且topViewController只跟踪推送了哪些视图UINavigationController(而不是那些以模态方式呈现的视图).

cocoa-touch objective-c uiviewcontroller uinavigationcontroller

55
推荐指数
2
解决办法
4万
查看次数

如何检查特定的UIViewController视图当前是否可见?

可能重复:
如何判断UIViewController的视图是否可见

我正在开发一个应用程序来处理来自网络的持续传入数据流,并为用户提供许多不同的UIView来查看该数据.

当某些模型数据根据来自网络的传入流进行更新时,我访问相关的UIViewController或UITableViewController,并在其上执行-setNeedsDisplay(在UIViewController的情况下)或-reloadData(在UITableViewController的情况下).

有没有办法检查当前是否正在显示给定的UIView(除了刚被加载)以便我只做--setNeedsDisplay或-reloadData如果用户当前正在查看该UIView?看起来在用户当前没有看到的视图上调用-setNeedsDisplay或reloadData会浪费处理能力,并且不利于电池寿命.当用户最终切换到之前已更新的视图时,在-viewWillAppear上执行-setNeedsDisplay或reloadData会更有意义.

谢谢

iphone objective-c

48
推荐指数
2
解决办法
6万
查看次数

如何识别出呈现UIViewController

我创建了一个UIViewController子类,它可以在UINavigationController的导航堆栈中推送,也可以从任何UIViewController呈现(模态).我需要确定是否显示了我的视图控制器,如果显示,我需要在视图控制器的顶部添加一个带有关闭按钮的工具栏.(否则,如果将其推入导航堆栈,则会添加默认关闭按钮,使用该用户可以返回.)

在UIViewController子类内部的所有可用版本中说4.3,5.0到6.0,如果满足以下条件,我可以假设视图控制器是以模态方式呈现的.

if(self.parentViewController == nil || self.navigationController == nil)
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uiviewcontroller modalviewcontroller ios

26
推荐指数
5
解决办法
3万
查看次数

事务在finishTransaction之后返回:已被调用

我正在使用应用程序内购买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 …

iphone in-app-purchase

23
推荐指数
3
解决办法
2万
查看次数

处理来自应用程序的非Ui部分的导航?

注意:当我谈论App后端时,我不是指服务器后端.App后端是应用程序的一部分.它是应用程序的非ui部分.

我有一个代码设计问题.使用j2objc Java用作iOS应用程序的后端,前端仍然是Objective-C.

哪个部分(前端或后端)应控制此模型中的导航?

考虑以下.最初的ViewController已加载.用户点击了一个按钮.以下是两种可能的情况:

  1. 前端接收手势并打开请求的ViewController

  2. 前端接收手势并将动作报告给Java后端.Java后端决定下一个要打开的页面,并告诉前端要显示哪个ViewController.

对我来说,第二种解决方案在代码分离方面似乎更有意义.但是我遇到了一个问题.假设您的应用程序中有以下ViewController结构:

  • 起始:UIViewController主要: UINavigationViewController
  • > Main-TabPage1: UIPageViewController
  • > Main-TabPage2: UIPageViewController
  • > Main-TabPage3:UIPageViewController设置: UIViewController

如果您在应用程序的级别导航,则很简单.您只需告诉前端打开Startpage,Main或Settings.但是,有什么用途点击按钮从"起始页"或从Main> Main-TabPage1转到Main> Main-TabPage3.您必须执行以下操作:

  • 万一你在Startpage:你必须告诉前端它应该审查Main,然后是Main TabPage3.
  • 万一你在Main> Main-TabPage1:你必须告诉前端它应该只显示Main-TabPage3.

你看到这样一个简单的页面方案的事件揭示了Java后端的ViewController似乎有很多需要考虑的案例.

这是从Java后端泄露视图的有效方式,还是看到更好的方法?

java objective-c ios swift j2objc

18
推荐指数
1
解决办法
508
查看次数

当应用程序在单独的线程中在iOS中处于活动状态时,定期从服务器轮询数据的最佳方法是什么?

我需要在iOS应用程序中定期轮询来自服务器的数据.我需要在一个线程中每隔10秒执行一次,以保持UI可用.当用户登录时,将触发此函数.我正在考虑使用NSRunLoopwith NSTimer来实现此功能,并且可能用于AFNetworking获取JSON数据.

这是正确的方法吗?应该使用GCD吗?

iphone nsrunloop ios

12
推荐指数
1
解决办法
6406
查看次数

在屏幕外渲染MKMapView

我试图渲染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,或isHiddentrue不工作(在地图中没有加载在这种情况下).救命?

mkmapview mkmapviewdelegate swift ios10

9
推荐指数
1
解决办法
507
查看次数

如何判断UIView是否在前面(可见)?

我需要检测前面的哪个视图(当前可见).我怎样才能做到这一点?

这是我想做的事情:

if ( ! <<methodToTellIfViewAIsInFront>>) {
  [viewA prepareToDisplay];
  [window bringSubviewToFront: viewA];
}
Run Code Online (Sandbox Code Playgroud)

iphone uiview

8
推荐指数
2
解决办法
4万
查看次数

有没有办法知道UIViewController是否已经以模态方式呈现和解散?

有没有办法知道UIViewController是否已经以模态方式呈现和解散?

就像是:

  • hasBeenPresentedModally
  • hasBeenDismissedModally

谢谢

ios

8
推荐指数
2
解决办法
7719
查看次数