【问题标题】:iPad application with multiple DetailView and have navigation in detailview具有多个 DetailView 并在 detailview 中导航的 iPad 应用程序
【发布时间】:2012-05-15 03:42:01
【问题描述】:

我正在寻找一种在 iPad 应用程序中拥有多个详细视图的方法,我在苹果开发者网站 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:]: 无法识别的选择器发送到实例...

showRootPopoverButtonItemRootViewController 协议中定义的方法

@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

提前致谢。

【问题讨论】:

    标签: ios ipad


    【解决方案1】:

    方法showRootPopoverButtonItem 的定义存在,似乎没有定义。你需要定义它。

    如果你想避免崩溃,那么你可以使用 -

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

    编辑 -

    我已经检查过了,发现你做错了什么,例如代码在willHideViewController-

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

    这需要一个视图控制器,而您正在传递导航控制器,而导航控制器又具有视图控制器(在其他位置类似),因此如果您想从应用程序委托传递导航控制器,您还需要更改这些代码。

    【讨论】:

    • 这些方法的定义在detailviewcontrollers中
    • 你从哪个控制器调用这个?
    • 我没有调用该方法,当我在 splitviewcontroller 中添加 detailviewcontroller 时,它运行良好,但是当我将 detailviewcontroller 放入 uinavigationcontroller 中,然后在 splitviewcontroller 中添加为详细视图时,它会引发此错误。在我上面提供的代码中,如果我不添加 detailNavController 它可以正常工作,但是当我添加它以在详细部分导航时出现此错误
    • 能显示ReportsViewController_iPad和DetailViewController_iPad的.h文件吗?
    • 我在主要问题中添加了 ReportsViewController.h 和 DetailViewController.h 和 .m
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 2012-03-24
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2015-08-25
    相关资源
    最近更新 更多