0

iPad アプリケーションで複数の詳細ビューを表示する方法を検索し、Apple 開発者サイトhttp://developer.apple.com/library/ios/#samplecode/MultipleDetailViews/Introduction/Intro.htmlでサンプル コードを見つけましたが、今ではこのサンプルではカバーされていない詳細ビューでナビゲーションが必要な場合は、uinavigationcontroller を詳細ビューに次のように追加します。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ReportsViewController_iPad *master = [[ReportsViewController_iPad alloc] initWithNibName:@"ReportsViewController_iPad" bundle:nil];

    DetailViewController_iPad *detail = [[DetailViewController_iPad alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];

    UINavigationController *masterNavController = [[[UINavigationController alloc] initWithRootViewController:master ] autorelease];

    UINavigationController *detailNavController = [[[UINavigationController alloc] initWithRootViewController:detail ] autorelease];

    splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavController , detailNavController, nil];

    [window addSubview:splitViewController.view];
    [window makeKeyAndVisible];

    return YES;
}

しかし、サンプルを実行するとエラーが発生しました

[UINavigationController showRootPopoverButtonItem:]:インスタンスに認識されないセレクターが送信されました...

showRootPopoverButtonItemのプロトコルで定義されたメソッドです。RootViewController

@protocol SubstitutableDetailViewController
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
@end

---- ReportsViewController.h

@protocol SubstitutableDetailViewController
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
@end

@protocol DetailViewControllerManagerDelegate

-(void) didSelectRowAtIndexPathPopOver:(NSString *)ID;

@end

@interface ReportsViewController_iPad : ReportsViewController<UISplitViewControllerDelegate , DetailViewControllerManagerDelegate>
{
    UISplitViewController *splitViewController;

    UIPopoverController *popoverController;

    UIBarButtonItem *rootPopoverButtonItem;
}

@property (nonatomic, assign) IBOutlet UISplitViewController *splitViewController;

@property (nonatomic, retain) UIPopoverController *popoverController;

@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem;

@property(nonatomic, retain) id<DetailViewControllerManagerDelegate> delegate;

-(void)didSelectRowAtIndexPath:(NSString*)ID;

@end

--DetailViewController.h

#import <UIKit/UIKit.h>
#import "ReportsViewController_iPad.h"

@interface DetailViewController_iPad : UIViewController<SubstitutableDetailViewController>
{
     UIToolbar *toolbar;
}

@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;

@end

--DetailViewController.m

#import "DetailViewController_iPad.h"

@implementation DetailViewController_iPad

@synthesize toolbar;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

#pragma mark -
#pragma mark Managing the popover

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {

    // Add the popover button to the toolbar.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray insertObject:barButtonItem atIndex:0];
    [toolbar setItems:itemsArray animated:NO];

    [itemsArray release];
}


- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {

    // Remove the popover button from the toolbar.
    NSMutableArray *itemsArray = [toolbar.items mutableCopy];
    [itemsArray removeObject:barButtonItem];
    [toolbar setItems:itemsArray animated:NO];
    [itemsArray release];
}


- (void)dealloc {
    [toolbar release];
    [super dealloc];
}   

@end

よろしくお願いします。

4

1 に答える 1

0

メソッドの定義showRootPopoverButtonItemが存在する場合、これは定義されていないようです。あなたはそれを定義する必要があります。

クラッシュを回避したい場合は、次を使用できます-

if ([aViewController respondsToSelector:@selector(showRootPopoverButtonItem:)]) {
    [aViewController performSelector:@selector(showRootPopoverButtonItem:) withObject:self.rootPopoverButtonItem];
}

編集 -

私はこれをチェックし、あなたが間違っていることを見つけました、例えばwillHideViewController-のコード

UIViewController <SubstitutableDetailViewController> *detailViewController =  [splitViewController.viewControllers objectAtIndex:1];

これはビューコントローラーを想定していますが、ナビゲーションコントローラーを渡すときにビューコントローラー(他の位置でも同様)が表示されるため、アプリデリゲートからナビゲーションコントローラーを渡す場合は、これらのコードも変更する必要があります。

于 2012-05-15T03:55:32.327 に答える