0

まず、私の英語で申し訳ありません。ボタン「次へ」が選択されたときにビューコントローラーをプッシュするナビゲーションコントローラーを備えたiPad用のアプリを実行しようとしています。しかし、ナビゲーション バーのボタンから呼び出されるポップオーバーも必要です。これにより、ユーザーは、あるビュー コントローラーから別のビュー コントローラーに「ジャンプ」して、tableView:didSelectRowAtIndexPath: および pushViewController:animated: メソッドでプッシュできますが、動いていない。

概要:

タブバー-> FirstViewController と SecondViewController を切り替えます (正常に動作します)

ナビゲーションバー ([次へ] ボタン) -> SecondViewController、FirstSlideController、SecondSlideController を切り替える (これも良い)

ポップオーバー-> ユーザーが SecondViewController、FirstSlideController、または SecondSlideController を選択します (ここに問題があります! )

コード:

AppDelegate

UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
UINavigationController *navigationController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];
UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
UINavigationController *navigationController2 = [[UINavigationController alloc] initWithRootViewController:viewController2];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[navigationController1, navigationController2];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;

TableViewController(popover) の didSelectRowAtIndexPath メソッド:

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

if(indexPath.row == 0){
 FirstSlideController *detailViewController = [[FirstSlideController alloc] initWithNibName:@"FirstSlideController" bundle:nil];
 [self.navigationController pushViewController:detailViewController animated:YES];
}

else if(indexPath.row == 1){
    SecondSlideController *detailViewController = [[SecondSlideController alloc] initWithNibName:@"SecondSlideController" bundle:nil];
    [self.navigationController pushViewController:detailViewController animated:YES];
}
else{
    SecondViewController *detailViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

}

SecondViewController (maros によって提案されたデリゲートを使用)

-(void) showPopover:(id) sender
{
   TableViewController *PopoverView = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:nil];
   self.popOver = [[UIPopoverController alloc] initWithContentViewController:PopoverView];
   self.popOver.delegate = self;
   [self.popOver presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections: UIPopoverArrowDirectionUp animated: YES];
}

self.navigationController を印刷しようとしましたが、null と表示されます。助けていただければ幸いです。

ありがとうございました。

4

1 に答える 1

1

提示された UIPopoverController は、提示元のビュー コントローラーのナビゲーション スタックにプッシュされません。これは別のView Controllerです。したがって、ポップオーバー内の navigationController は nil です。

私がお勧めするのは、デリゲートMyNavigationPopoverDelegate (ポップオーバー ( PopoverController ) を作成するクラス) を作成することです。そのインスタンスをデリゲートとしてTableViewControllerに渡します。

ユーザーがポップオーバー内のボタンをクリックした後、デリゲートのメソッドを呼び出してボタンのクリックを処理します ( myNavigationPopover:(UIPopoverController*)popover clickedButtonAtIndex:(NSInteger)buttonIndex )。

それでは、デリゲートを解任しますか?

最後に、ナビゲーションを好きなように変更してください。:)

@protocol MyNavigationPopoverDelegate
- (void) myNavigationPopover:(UIPopoverController*)popover clickedButtonAtIndex:(NSInteger)buttonIndex;
@end

@interface TableViewController : UITableVieController // your viewController in popover
... // your code
@property (nonatomic, weak) NSObject <MyNavigationPopoverDelegate> * delegate;
... // your code
@end

@implementation TableViewController
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.delegate myNavigationPopover:self clickedButtonAtIndex:indexPath.row];
}
...
@end

// defines that SecondViewController implements the delegate's method
@interface SecondViewController <MyNavigationPopoverDelegate> : UIViewController 
  // your code
@end

// code where you presenting popover 
@implementation SecondViewController

// This is the method that is executed after your button press and it is responsible for presenting a popover
- (void) presentPopover{
   ...
   myPopover.delegate = self; // setting the delegate
   [myPopover presentPopoverFromXXX ...]; // however you present it
   ...
}

 - (void) myNavigationPopover:(UIPopoverController*)popover clickedButtonAtIndex:(NSInteger)buttonIndex
 {
 UINavigationController *currentNavigationController = ; // get the navigation controller from the tab bar

 if(buttonIndex == 0){
      FirstSlideController *detailViewController = [[FirstSlideController alloc] initWithNibName:@"FirstSlideController" bundle:nil];
      [currentNavigationController pushViewController:detailViewController animated:YES];
 }

 else if(buttonIndex == 1){
      SecondSlideController *detailViewController = [[SecondSlideController alloc] initWithNibName:@"SecondSlideController" bundle:nil];
      [currentNavigationController pushViewController:detailViewController animated:YES];
 }
 else{
      SecondViewController *detailViewController = [[SecondViewController alloc]         initWithNibName:@"SecondViewController" bundle:nil];
      [currentNavigationController pushViewController:detailViewController animated:YES];
 }
}

@end;
于 2013-10-24T13:36:15.897 に答える