2012-07-19 88 views
0

我有一个类RootViewController获取属性在那里我有声明的UIBarButtonItem。的方法,以显示它是在另一个类FirstDetailViewController无法从另一个类

我试图访问它在另一个类SecondDetailViewController,但它始终是零。我测试了一些其他变量,它们也是空的。下面是我有:

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]; 
... 
+0

你在哪儿SecondDetailViewController声明detailViewController? – 2012-07-19 18:13:11

+0

添加一个断言来验证barButtonItem不是无 - (void)splitViewController :(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem :(UIBarButtonItem *)barButtonItem forPopoverController :(UIPopoverController *)pc同样assert(root )在你的SecondDetailViewController。使用大量的资产可以帮助你自己发现这些问题。 – 2012-07-19 18:17:20

+0

只是猜测,你没有设置酒吧按钮项目,然后再尝试访问它。 – Dustin 2012-07-19 18:36:21

回答

0

你可能SecondDetailViewController的“根”属性不能设置为要访问的UIBarButtonItem的RootViewController的实例。然后你在SecondDetailViewController代码中读取RootViewController的一个未初始化的实例,并且你没有得到一个错误的唯一原因是Objective C默默地忽略了对nil对象上的方法的调用(在这种情况下是rootPopoverButtonItem getter方法,其中root.rootPopoverButtonItem是简写)。

如果你的的“RootViewController的”实例被称为“myRootViewController”,然后在你的代码的某个地方,你需要做的是这样的:

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

然后你就可以访问RootViewController的副本有酒吧你想要的按钮。

+0

确实是这个问题,谢谢 – BloonsTowerDefence 2012-07-20 18:57:08