![](/img/trans.png)
[英]How can i access a ViewController that's a segue from a Tableview in another ViewController from my AppDelegate?
[英]How do I access my viewController from my 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;
}
您可以通過以下方式訪問它:
MyViewController* mainController = (MyViewController*) self.window.rootViewController;
如果您將視圖嵌套在 tabviewcontroller 或導航 controller 后面,它將返回給您,您將需要訪問其中的視圖 controller
如何使用良好的老式NSNotifications從您的應用程序委托向任何正在收聽的人(例如您的視圖控制器)發送消息需要更新? 或者您可以使用Key Value Observing ,這樣您的視圖 controller 就可以在您的應用程序委托中觀看某些屬性。
由於您只有一個視圖 controller,通用方式(獨立於您的應用程序的設置方式):
UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
如果你想獲得任何其他UIViewController
,而不僅僅是rootViewController
:
UIWindow *window=[UIApplication sharedApplication].keyWindow;
UIViewController *root = [window rootViewController];
UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
Swift 方法,您可以從任何地方調用它,而不僅僅是 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
}
它作為標准 function 包含在:
如果您使用基於視圖的應用程序模板,則應該可以通過應用程序委托中的屬性訪問單個視圖 controller。 它與設置為導航 controller 的根視圖 controller 的視圖 controller 相同。
如果由於某種原因你的項目設置不同,你可以得到 window 的根視圖 controller,應該是導航 controller,然后得到它的頂視圖 controller。
編輯:所以問題是這樣的:使用 iOS5 和故事板,Apple 已經提取了很多您過去可以訪問的初始設置(如果您選擇退出故事板,仍然會這樣做)。 他們更改了傳遞給 main() 的 arguments,並在 storyboard(實際上只是一個筆尖)中進行了更多設置。 恕我直言,這部分是為了防止人們通過繁重的操作使 AppDelegate 超載,就像您在自己的操作中所做的那樣。 AppDelegate 本質上是為了管理應用程序生命周期而存在的。 它並不是真的要執行將信息傳遞給視圖控制器的方法。 確實,視圖控制器的工作就是完成繁重的工作來為自己提供數據。 我建議將代碼移動到您的視圖 controller 中,也許在 viewDidLoad 中。 如果你需要知道你正在做的 launchOptions objectForKey 測試的結果,你可以非常簡單地在你的 AppDelegate 上創建一個屬性,比如 BOOL launchOptionsURLKeyExists,並適當地設置它。 然后你只需在視圖 controller 中獲取此屬性的值。你的 AppDelegate 已經是 singleton,因此你可以通過 [UIApplication sharedApplication].delegate 訪問它
編輯 2:當視圖添加到視圖 controller 中的 UIApplicationDidEnterForegroundNotification 通知時調用 viewWillAppear/viewDidAppear,並在發布該消息時做出適當響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.