0

最初の UITableView は、アプリケーションの RootViewController から呼び出される Popover 内に表示されます。

同じポップオーバー内の別の UITableView に移動する必要があります。これは、2 番目の UITableView のオブジェクトをインスタンス化し、最初の UITableView からプッシュするだけで簡単に実行できます。

次の段落では、いくつかの事実を当然のこととして書いていますが、間違っている場合は訂正してください。

ここでの問題は、このプロセスを appDelegate 内で実行する必要があることです。これは、私が Dropbox API を実装していて、ログイン プロセスが完了した直後に pushViewController を実行する必要があるためです。つまり、UITableViews を介したナビゲーションは、アプリケーション内で実行する必要があります:handleOpenURL です。application:handleOpenURL をすぐに呼び出す必要があると想定しています。そのため、Dropbox API 検証ウィンドウが表示された後にナビゲーションを実行するには、ユーザーに他に何もさせることなく、そこで pushViewController を実行する必要があると想定しています。 .

これは私のコードがどのように見えるかです:

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;

TableViewControllerForStorageLost.m

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

もちろん、Application:HandleOpenURL が実行されていることは確認しましたが、そこから PushView を呼び出すと、[ViewController PushView]: unrecognized selector sent to instance というエラーが表示されます

では、そこからナビゲーションを行うにはどうすればよいでしょうか。目標 c についてどの基本事項が欠けていますか?

4

1 に答える 1

2

あなたの質問からあなたのアプリがどのように構造化されているかは明らかではないため、この回答はあなたの問題に対する最良の解決策ではないかもしれませんが、ビュー コントローラーの階層がアプリのデリゲートからどのように構築されているかについてのアイデアが得られることを願っています。

最初のView Controllerクラスの名前がFirstViewController. アプリ デリゲートがこのビュー コントローラーのインスタンスへの直接参照を持っているか、親ビュー コントローラーを介して (おそらく を介してwindow.rootViewController) アクセスできます。

FirstViewControllerここで、 namedpushNextViewControllerに 2 番目のテーブル ビュー コントローラーをプッシュするタスクを実行するメソッドがあるとします。

application:handleOpenURL:アプリ デリゲートのメソッド内からそのメソッドを呼び出すことができます。

これは次のようになります。

[self.window.rootViewController.firstViewController pushNextViewController];

のインスタンスへの参照を取得する方法は他にもあります。カスタム サブクラスのFirstViewController場合はよりクリーンになるため、そこにメソッドを作成し、そのメソッドからインスタンスに次のように指示できます。rootViewControllerpushNextViewControllerFirstViewControllerpushNextViewController

[self.window.rootViewController pushNextViewController];

上記の両方の例で、rootViewController実際にインスタンスであるクラスにキャストする必要があることに注意してください。そうしないと、プロパティfirstViewController(例 1) またはメソッドpushNextViewController(例 2) がないことがコンパイラによって警告されます。

編集:rootViewControllerが の場合UINavigationController、コードは次のようになります。

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

編集 2: OK、ここでの混乱は、windowオブジェクトにrootViewControllerプロパティ (を指しているように見えるnavigationController) がありrootViewController、アプリデリゲートにインスタンス変数があることです。これらは 2 つの異なるオブジェクトであるため、命名規則が少し混乱しますが、私が正しければ、次のように動作するはずです。

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

        }
        return YES;
    }

    return NO;
}

アプリ デリゲートの参照の名前を、混乱を軽減するTableViewControllerForStorageList以外の名前に変更することを検討する必要があります。rootViewController

于 2013-01-22T01:05:02.947 に答える