0

宣言したクラスRootViewControllerがあります。UIBarButtonItemそれを表示するメソッドは別のクラスにありFirstDetailViewControllerます。

別のクラスでアクセスしようとしていますSecondDetailViewControllerが、常にnullです。私は他のいくつかの変数でテストしましたが、それらもnullでした。これが私が持っているものです:

RootViewController.h

@interface RootViewController : UITableViewController <UISplitViewControllerDelegate> {

}

@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem;
...
@end

RootViewController.m

#import "RootViewController.h"
#import "FirstDetailViewController.h"

@implementation RootViewController

@synthesize popoverController, splitViewController, rootPopoverButtonItem;

- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc {

    NSLog(@"splitviewController will hide");

    // Keep references to the popover controller and the popover button, and tell the detail view controller to show the button.
    barButtonItem.title = @"Menu";
    self.popoverController = pc;
    self.rootPopoverButtonItem = barButtonItem;
    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
    [detailViewController showRootPopoverButtonItem:rootPopoverButtonItem];
}

FirstDetailViewController.m

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

    NSLog(@"show root popover button item");

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

SecondDetailViewController.h

    #import "RootViewController.h"

    @class RootViewController;

    @interface SecondDetailViewController : UIViewController <SubstitutableDetailViewController, UIScrollViewDelegate, UITextFieldDelegate, UITextViewDelegate> {
    ...
    }
    @property (nonatomic, retain) RootViewController *root;
    @end

SecondDetailViewController.m

#import "SecondDetailViewController.h"

@implementation SecondDetailViewController

@synthesize root;

...
NSLog(@"view class : %@", [root.splitViewController class]);
[detailViewController showRootPopoverButtonItem:root.rootPopoverButtonItem];
...
4

1 に答える 1

0

おそらく、SecondDetailViewController の「ルート」プロパティを、UIBarButtonItem にアクセスする RootViewController のインスタンスに設定していません。次に、SecondDetailViewController コードで RootViewController の初期化されていないインスタンスを読み取っています。エラーが発生しない唯一の理由は、Objective C が nil オブジェクトのメソッドへの呼び出しを暗黙のうちに無視するためです (この場合は rootPopoverButtonItem getter メソッドであり、これroot.rootPopoverButtonItemはの省略形)。

「RootViewController」のインスタンスが「myRootViewController」と呼ばれる場合、コードのどこかで次のようにする必要があります。

SecondDetailViewController *mySecondDetailViewController = [[SecondDetailViewController alloc] init];
mySecondDetailViewController.root = myRootViewController;

次に、必要なバー ボタンを持つ RootViewController のコピーにアクセスします。

于 2012-07-19T21:08:14.117 に答える