60

Вопрос по ios – Как я могу получить доступ к моему viewController из моего appDelegate? IOS

У меня есть приложение для iOS, которое я создал как «приложение на основе представления» в xCode. У меня есть только один viewController, но он отображается автоматически, и я не вижу кода, связывающего его с моим appDelegate. Мне нужно передать данные из моего appDelegate в мой viewController, но я не знаю, как это осуществить.

Мое приложение Delegate.h:

#import <UIKit/UIKit.h>


@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSDictionary *queryStrings;

@end

Также appDidFinishLoadingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[JMC sharedInstance] configureJiraConnect:@"https://cmsmech.atlassian.net/"           projectKey:@"WTUPLOAD" apiKey:@"7fc060e1-a795-4135-89c6-a7e8e64c4b13"];

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsURLKey] != nil) {
        NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey];
        NSLog(@"url received: %@", url);
        NSLog(@"query string: %@", [url query]);
        NSLog(@"host: %@", [url host]);
        NSLog(@"url path: %@", [url path]);
        queryStrings = [self parseQueryString:[url query]];
        NSLog(@"query dictionary: %@", queryStrings);
    }
    else {
        queryStrings = [self parseQueryString:@"wtID=nil"];
    }

    return YES;
}
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от HackyStack
  • Error: User Rate Limit ExceededdelegateError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededselfError: User Rate Limit Exceeded-windowError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от HackyStack
  • Error: User Rate Limit Exceeded

    от HackyStack
  • Error: User Rate Limit Exceeded

    от HackyStack
  • Error: User Rate Limit Exceededstackoverflow.com/questions/10017305/…

    от HackyStack
  • Error: User Rate Limit Exceeded

    от
6 ответов
  • 6

    Быстрый способ сделать это

    вы можете вызывать это из любого места, а не только appdelegate:

    /// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
    public var topMostVC: UIViewController? {
        var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
        while let pVC = presentedVC?.presentedViewController {
            presentedVC = pVC
        }
    
        if presentedVC == nil {
            print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
        }
        return presentedVC
    }
    

    Он включен в качестве стандартной функции в:

    https://github.com/goktugyil/EZSwiftExtensions

  • 12

    Поскольку у вас есть только один контроллер представления

    общий способ (независимо от того, как было настроено ваше приложение):

    UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
    

  • 99

    Вы можете получить к нему доступ с помощью:

    MyViewController* mainController = (MyViewController*)  self.window.rootViewController;
    

    Если вы вкладываете свой вид за контроллером табуляции или контроллером навигации, он вернет его вам, и вам потребуется доступ к вашему контроллеру представления внутри него.

  • 0

    Если вы использовали шаблон приложения на основе представления

    один контроллер представления должен быть доступен через свойство в делегате приложения. Это тот же контроллер представления, который установлен в качестве корневого контроллера представления контроллера навигации.

    Если по какой-то причине ваш проект был настроен по-другому, вы можете получить корневой контроллер окна, которым должен быть навигационный контроллер, а затем получить его контроллер верхнего вида.

    EDIT: Таким образом, проблема заключается в следующем: с iOS5 и раскадровками Apple абстрагировалась от многих начальных настроек, к которым у вас был доступ (и до сих пор делают, если вы отказываетесь от раскадровок). Они изменили аргументы, переданные main (), и сделали больше настроек в раскадровке (которая на самом деле просто перо). ИМХО, это отчасти для того, чтобы люди не перегружали AppDelegate тяжелыми операциями, как будто вы делаете это у себя. AppDelegate, по сути, существует для управления жизненным циклом приложения. На самом деле это не означает выполнение методов, которые передают информацию вашим контроллерам представления. На самом деле ваша задача контроллера представления заключается в том, чтобы выполнять тяжелую работу по обеспечению себя данными. Я бы предложил перенести код в ваш контроллер представления, возможно, в viewDidLoad. Если вам нужно узнать результат теста objectForKey launchOptions, который, по-видимому, вы делаете, вы можете очень просто создать свойство в AppDelegate, скажем BOOL launchOptionsURLKeyExists, и установить его соответствующим образом. Затем вы просто получаете значение этого свойства в вашем контроллере представления. Ваш AppDelegate уже является одноэлементным, поэтому вы можете получить к нему доступ либо с помощью [UIApplication sharedApplication] .delegate

    EDIT 2: viewWillAppear / viewDidAppear вызывается, когда представление добавляется в уведомление UIApplicationDidEnterForegroundNotification в вашем контроллере представления, и отвечает соответствующим образом, когда это сообщение публикуется.

  • 20

    Как насчет использования старого доброго стиля?

    NSNotifications отправить сообщение от вашего представителя приложения любому слушающему (например, вашему представителю), что что-то нужно обновить? или вы можете использоватьНаблюдение за ключевыми значениями так что ваш контроллер представления может наблюдать какое-то свойство в вашем делегате приложения.

  • 8

    Если вы хотите получить любой другой

    UIViewControllerне толькоrootViewController:

    UIWindow *window=[UIApplication sharedApplication].keyWindow;
    UIViewController *root = [window rootViewController];
    
    UIStoryboard *storyboard = root.storyboard;
    CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];