0

中央パネルのコンテンツを変更するための UITableView を含む左側のメニューでJASidePanelsを使用するプロジェクトがあります。

カスタム URL スキームを介してコントローラーにディープ リンクできるようにするため、ビュー切り替え機能を handleOpenURL: 関数の一部として AppDelegate.m ファイルに移動しました。これで、メニュー コントローラーの didSelectRowAtIndexPath: 関数を次のようにカスタム URL を呼び出すように更新しました。

- (void)tableView:(UITableView *)aTableView 
  didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger index = indexPath.row;

    NSDictionary *item = self.menu[index];

    NSURL *myURL = [NSURL URLWithString:item[@"url"]];

    [[UIApplication sharedApplication] openURL:myURL];
}

ストーリーボードの代わりに .xibs を使用する場合の AppDelegate の handleOpenURL: 関数は次のようになります。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

    if ([[url host] isEqualToString:@"goto"]) {

        for (int i = 0; i < [self.leftMenuViewController.tableView
          numberOfRowsInSection:0]; i++) {

            [self.leftMenuViewController.tableView 
              deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i
              inSection:0] animated:NO];

            UITableViewCell *deselectedCell = [self.leftMenuViewController.tableView
              cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i
              inSection:0]];

            deselectedCell.backgroundColor = [UIColor clearColor];
        }

    ...

    }
}

これは、ストーリーボードを使用せず、xib ファイルでインターフェイスを作成するときに、Menu Controller の UITableView のすべての行を選択解除してフォーマットすることで、必要に応じて機能します。

ストーリーボードを使用するときに問題が発生します。別のコントローラー (SidePanelController) によってストーリーボード内からインスタンス化されたときに、AppDelegate 内から MenuViewController から (UITableView *)tableView にアクセスするにはどうすればよいですか?

didFinishLaunchingWithOptions: 関数内で次のコードを使用してストーリーボードを設定しています。

self.storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]];
self.viewController = [storyboard instantiateInitialViewController];

self.window.rootViewController = self.viewController;

そのため、コントローラーの新しいインスタンスを作成するのではなく、既にインスタンス化されている MenuViewController のインスタンスにアクセスする必要があります。次の方法でtableViewにアクセスしようとしました:

SidePanelController *panelController = (SidePanelController *)self.window.rootViewController;
UIViewController *menuViewController = (MenuViewController *)panelController.leftPanel;
UITableView *menuTableView = (UITableView *)menuViewController;

しかし、あまり運がありません。ストーリーボードでインスタンス化されたビューから UITableView をプログラムで取得することは可能ですか?

前もって感謝します

4

1 に答える 1

1

サイドバーのナビゲーションに JASidePanels を使用しているときに AppDelegate から Storyboard ビューの UITableView にアクセスしようとしたときに同様の問題が発生した場合は、上記で説明した自分の問題の解決策に気付きました。

JASidePanelController.h ファイルで、次の行を更新します。

// set the panels
@property (nonatomic, strong) UIViewController *leftPanel;   // optional

私の場合、作成した左側のメニュービューコントローラーに:

// set the panels
@property (nonatomic, strong) MenuViewController *leftPanel;   // optional

また、JASidePanelController.m ファイルで、次のメソッド宣言を更新します。

- (void)setLeftPanel:(UIViewController *)leftPanel {

- (void)setLeftPanel:(MenuViewController *)leftPanel {

上記を実行すると、AppDelegate から次の構文を使用して、左側のメニューの tableView を操作できるようになります。

SidePanelController *panelController = (SidePanelController *)self.window.rootViewController;

[panelController.leftPanel.tableView reloadData];
于 2014-05-06T18:44:48.877 に答える