0

我使用蘋果的MuiltipleDetailViewController示例應用程序,並得到消息「的UIViewController可能不響應showRootPopoverButtonItem」的UIViewController可能不響應showRootPopoverButtonItem

這XCode中3.X工作,但我得到4.2

消息

該應用程序本身功能爲100%,每個筆尖都可以識別彈出窗口,而橫向模式下的左側表格也可識別該彈出窗口。但我無法提交此警告。我需要改變什麼?

RootViewController.h

#import <UIKit/UIKit.h> 


/* 
SubstitutableDetailViewController defines the protocol that detail view controllers must adopt. The protocol specifies methods to hide and show the bar button item controlling the popover. 

*/ 
@protocol SubstitutableDetailViewController <NSObject> 
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem; 
@end 


@interface RootViewController : UITableViewController <UISplitViewControllerDelegate> { 

    UISplitViewController *splitViewController; 

    UIPopoverController *popoverController;  
    UIBarButtonItem *rootPopoverButtonItem; 

    //UINavigationBar *navigationBar; 
} 

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

@property (nonatomic, retain) UIPopoverController *popoverController; 
@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem; 


//@property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar; 

@end 

RootViewController.m:

#import "RootViewController.h" 
#import "WebViewController.h" 
#import "Twitter.h" 
//#import "SubstitutableDetailViewController.h" 



@implementation RootViewController 

@synthesize splitViewController, popoverController, rootPopoverButtonItem;//, navigationBar; 


#pragma mark - 
#pragma mark View lifecycle 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    // Set the content size for the popover: there are just two rows in the table view, so set to rowHeight*2. 
    self.contentSizeForViewInPopover = CGSizeMake(310.0, self.tableView.rowHeight*2.0); 
    //self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:255/255 green:104/255 blue:1/255 alpha:1]; 
} 
/* 
-(void)customizeAppearance { 
    //create resizable images 
    UIImage *bluImage = [UIImage imageNamed:@"blu.jpg"];// resizableImageWithCapInsets:(0, 0, 0, 0)]; 

    //set the bg for *all* UINavBars 
    [[UINavigationBar appearance] setBackgroundImage:bluImage forBarMetrics:UIBarMetricsDefault]; 
} 
*/ 

-(void) viewDidUnload { 
    [super viewDidUnload]; 

    self.splitViewController = nil; 
    self.rootPopoverButtonItem = nil; 
} 

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


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

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


- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { 

    // Nil out references to the popover controller and the popover button, and tell the detail view controller to hide the button. 
    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1]; 
    [detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem]; 
    self.popoverController = nil; 
    self.rootPopoverButtonItem = nil; 
} 


#pragma mark - 
#pragma mark Table view data source 

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { 

    // Two sections, one for each detail view controller. 
    return 2; 
} 


- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"RootViewControllerCellIdentifier"; 

    // Dequeue or create a cell of the appropriate type. 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Set appropriate labels for the cells. 
    if (indexPath.row == 0) { 
     cell.textLabel.text = @"Twitter"; 
    } 

    else if (indexPath.row == 1) { 
     cell.textLabel.text = @"Contact Us"; 
    } 


    cell.textLabel.textColor = [UIColor whiteColor]; 
    cell.textLabel.backgroundColor = [UIColor blackColor]; 
    cell.contentView.backgroundColor = [UIColor blackColor]; 
    cell.detailTextLabel.backgroundColor = [UIColor blackColor]; 
    return cell; 
} 


#pragma mark - 
#pragma mark Table view selection 

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

    /* 
    Create and configure a new detail view controller appropriate for the selection. 
    */ 
    NSUInteger row = indexPath.row; 

    UIViewController *detailViewController = nil; 

    if (row == 0) { 
     Twitter *newDetailViewController = [[Twitter alloc] 
                 initWithNibName:@"Twitter" 
                 bundle:nil]; 
     detailViewController = newDetailViewController; 
    }  

    if (row == 1) { 
     WebViewController *newDetailViewController = [[WebViewController alloc] 
                 initWithNibName:@"WebViewController" 
                 bundle:nil]; 
     newDetailViewController.detailURL= 
     [[NSURL alloc] initWithString:@"http://www.chipmunkmobile.com/contact.html"]; 

     detailViewController = newDetailViewController; 
    } 

    // Update the split view controller's view controllers array. 
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil]; 
    splitViewController.viewControllers = viewControllers; 
    [viewControllers release]; 

    // Dismiss the popover if it's present. 
    if (popoverController != nil) { 
     [popoverController dismissPopoverAnimated:YES]; 
    } 

    // Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created). 
    if (rootPopoverButtonItem != nil) { 
     [detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 
    } 


    [detailViewController release]; 
} 

#pragma mark - 
#pragma mark Managing the popover 


/* 
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { 
    // Add the popover button to the left navigation item. 
    [navigationBar.topItem setLeftBarButtonItem:barButtonItem animated:NO]; 
} 


- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { 
    // Remove the popover button. 
    [navigationBar.topItem setLeftBarButtonItem:nil animated:NO]; 
} 
*/ 

#pragma mark - 
#pragma mark Memory management 

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

@end 

這裏是確切的線在那裏我得到警告 enter image description here

+0

你有這種方法註釋掉了......你期望發生什麼? – 2012-02-08 21:53:30

回答

2

您收到此警告的原因是因爲這個UIViewController *detailViewController UIViewController中沒有一個叫做「showRootPopoverButtonItem」的方法。如果你想擺脫的警告只是這樣做,而不是:

[(WebViewController*)detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 

[(Twitter*)detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 

你只需要讓它知道它不是真的只是一個的viewController,它的一個子類的viewController創建。那麼什麼是類showRootPopoverButtonItem:在你只需要輸入它就可以了。

+0

WOO HOO!...謝謝!!! – SnowboardBruin 2012-02-09 17:43:39

0

如果你的圖像想讓你的代碼完全一樣b擺脫警告你可以做到這一點。

if (rootPopoverButtonItem != nil) { 
     [detailViewController performSelector:@selector(showRootPopoverButtonItem:) withObject:self.rootPopoverButtonItem]; 
    } 

如果你想要更小心,你應該使用這個。

if (rootPopoverButtonItem != nil && [detailViewController respondsToSelector:@selector(showRootPopoverButtonItem:)]) { 
     [detailViewController performSelector:@selector(showRootPopoverButtonItem:) withObject:self.rootPopoverButtonItem]; 
    } 

更新

通過您的代碼閱讀,你可以只指定在detailViewController委託就像你在其他功能方面做了之後。

UIViewController<SubstitutableDetailViewController> *detailViewController = nil; 

    if (row == 0) { 
    //... 
0

(1)指定爲detailedViewController的類型:(TYPE *)OBJECTNAME ...

(2)然後指定方法調用[(TYPE *)OBJECTNAME METHODCALL];

(*)您會收到警告,因爲編譯器不知道您使用的是何種類型的對象。如果您創建了UIViewController的子類,那麼在訪問方法時必須指定類型。確保該方法在.h中,以便您可以訪問它。

相關問題