2013-01-21 66 views
0

第一UITableView中提出了一種對從應用程序的RootViewController的所謂酥料餅的內部。從一個的UITableView導航到另一個內部的appDelegate

我需要導航到另一個UITableView在同一個彈出窗口內。如果你僅僅實例化第二個UITableView的對象並從第一個對象中推入它,這很容易實現。

在下一段我寫的是理所當然的一些事實,請糾正我,如果我錯了。

的這裏的問題是,這個過程應該在的appDelegate內進行。這是因爲我實現了Dropbox API,並且我需要在登錄過程完成後立即完成pushViewController,這意味着通過UITableViews的導航必須在應用程序內完成:handleOpenURL。我認爲應用程序:handleOpenURL必須在那裏調用,這就是爲什麼我還要pushumeController必須在那裏完成,以便在Dropbox API驗證窗口呈現後完成導航,而不必讓用戶執行任何操作。

這是我的代碼看起來像:

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate>{ 
    UINavigationController *navigationController; 
    NSString *relinkUserId; 
    UIWindow *window; 
    TableViewControllerForStorageList *rootViewController; 
    ViewController *viewController; 
} 
@property (nonatomic, strong) IBOutlet UIWindow *window; 
@property (nonatomic, strong) IBOutlet UINavigationController *navigationController; 
@property (nonatomic, strong) IBOutlet TableViewControllerForStorageList *rootViewController; 
@property (nonatomic, strong) IBOutlet ViewController *viewController; 

AppDelegate.m

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) { 
     if ([[DBSession sharedSession] isLinked]) { 
      [(TableViewControllerForStorageList *)self.window.rootViewController PushView]; 

     } 
     return YES; 
    } 

    return NO; 
} 

TableViewControllerForStorageList.h

-(void)PushView; 

TableViewControllerF orStorageLost.m

-(void)PushView 
{ 
    TableViewControllerIpadStorage *tableViewControllerIpadStorage = [[TableViewControllerIpadStorage alloc]initWithNibName:@"TableViewControllerIpadStorage" bundle:Nil]; 
    [self.navigationController pushViewController:tableViewControllerIpadStorage animated:YES]; 
} 

當然,我得到了肯定的應用:HandleOpenURL正在運行,但是從那裏調用PushView當誤差[視圖控制器PushView]:無法識別的選擇發送到實例

那麼,怎樣才能使導航是從那裏完成的?關於目標c的哪些基本知識我缺少?

回答

2

它不是從你的問題清楚你的應用程序是如何構成的,所以這個答案可能不是你的問題的最佳解決方案,但希望它給你的一些想法如何您的視圖控制器的層次結構很可能從你的應用程序代理建立。

比方說你的第一個視圖控制器類被命名爲FirstViewController。您的應用程序委託可以直接引用此視圖控制器的實例,也可以通過父視圖控制器訪問它(可能通過window.rootViewController)。

現在讓我們假設您有一個名爲pushNextViewControllerFirstViewController中的方法,該方法執行推送第二個表視圖控制器的任務。

您可以從您的應用程序委託的application:handleOpenURL:方法中調用該方法。

這可能看起來像:

[self.window.rootViewController.firstViewController pushNextViewController]; 

還有其他的方法,你可以得到你的FirstViewController實例的引用,這將是清潔的,如果你的rootViewController是一個自定義的子類,所以你可以創建一個pushNextViewController方法那裏,從方法告訴你FirstViewController實例pushNextViewController

[self.window.rootViewController pushNextViewController]; 

注意在上述兩個例子中,你將需要轉換rootViewController它實際上是什麼類的一個實例或編譯器會警告你,它不具有財產firstViewController(例如1)或方法pushNextViewController(例如2)。

編輯:如果您rootViewControllerUINavigationController,那麼你的代碼可能看起來更像:

UINavigationController* navController = (UINavigationController*)window.rootViewController; 
FirstViewController* vc = navController.viewControllers[0]; 
[vc pushNextViewController]; 

編輯2: OK,它看起來像混亂這裏就是window對象有rootViewController屬性(它似乎指向您的navigationController),然後您的應用程序委託中還有一個rootViewController實例變量。這是兩個不同的對象,使您的命名約定有點混亂,但如果我是對的,然後下面應該工作:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) { 
     if ([[DBSession sharedSession] isLinked]) { 
      [rootViewController PushView]; 

     } 
     return YES; 
    } 

    return NO; 
} 

你應該考慮改變您的應用程序委託的引用的名字你TableViewControllerForStorageList比其他東西rootViewController以緩解一些混淆。

+0

謝謝,我覺得這是我需要的答案,但如何將代碼看起來,如果我按照使用說明:「你需要轉換到RootViewController的,它實際上是什麼類的實例」? –

+0

如果你問一般的類型轉換看起來如何,你應該在Objective-C上閱讀一下,因爲可能還有其他你不熟悉的關鍵語言特性。至於你的具體情況,它取決於你要類型化的是什麼類,但是乾淨的代碼在我上面的第二次編輯(我將'rootViewController'轉換爲'UINavigationController *')中看起來類似於我的代碼。我真的推薦一些閱讀/谷歌搜索,但如果你想要更具體的幫助,讓你通過這個,然後在你的問題提供一些代碼讓我離開。 – Mathew

+0

檢查我的編輯請 –

相關問題