如何在后台刷新期间从AppDelegate.m访问视图控制器

时间:2015-06-10 11:33:50

标签: ios uinavigationcontroller

我正在尝试在我的应用中实现后台刷新。我有一个方法refreshMessages位于UIViewControllers之一(我正在使用UINavigationController)。我需要从AppDelegate.m访问此控制器。

通常我会做这样的事情:

UINavigationController *navigationController = [self.window.rootViewController navigationController];

获取导航控制器,然后我可以从那里访问它们。但是现在肯定不会起作用。该应用程序位于BACKGROUND中,没有显示任何窗口。有关如何解决这个问题的任何想法?谢谢!

这是我的背景刷新:

-(void)application:(UIApplication *)application
performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {



    NSLog(@"Doing the background refresh");

    UINavigationController *navigationController = [self.window.rootViewController navigationController];
    NSLog(@"Number of controllers is %d", [[navigationController viewControllers] count]);
    //There are zero controllers?!!! Must be because no window is showing
    completionHandler(UIBackgroundFetchResultNewData);



}

1 个答案:

答案 0 :(得分:1)

是的,你是对的。 nil将为AppDelegate,因为它将不再位于视图层次结构中。

一个厚颜无耻的解决方案是通过在AppDelegate.h中创建一个属性来保存视图控制器的引用。您可以通过在视图控制器中订阅相关通知,在应用程序转到后台时分配此项。

编辑:已添加代码

@property (nonatomic, weak) YourViewController *yourViewController;

viewDidLoad

在YourViewController.m中,[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; 中的某个地方

appWillResignActive

-(void)appWillResignActive:(id)sender { YourAppDelegate *delegate = [UIApplication sharedApplication].delegate; delegate.yourViewController = self; } 的实施

[self.yourViewController refreshMessages]

在您的完成处理程序

NSData *imageData = UIImageJPEGRepresentation(YOURIMAGE, 0.5);
NSDictionary * dicParamsToSend  = @{@"room" : room,
                                    @"description" : description };
AFHTTPRequestOperation *op = [manager POST:@"rest.of.url" parameters:dicParamsToSend constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    //do not put image inside parameters dictionary as I did, but append it!
    [formData appendPartWithFileData:imageData name:@"image" fileName:@"photo.jpg" mimeType:@"image/jpeg"];

} success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"Success: %@ <=> %@", operation.responseString, responseObject);

}failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    NSLog(@"Error: %@ <=> %@", operation.responseString, error);

}];
[op start];

此外,请确保在取消分配视图控制器后删除观察者。

相关问题