2013-09-16 36 views
1

我有一個主控細節視圖控制器,我試圖編寫一個顯示或隱藏主列表的方法/消息。我已經遵循了this almost identical question的所有答案,但他們都不適合我。我正在開發iOS6,但即使按照解決此問題的答案的建議,我仍然無助於SIG_ABRT錯誤。如何在SplitView控制器中隱藏和取消隱藏主視圖控制器

這裏是我的代碼:

WWFMasterViewController.h:

#import <UIKit/UIKit.h> 
@class WWFDetailViewController; 
@interface WWFMasterViewController : UITableViewController 
@property (strong, nonatomic) WWFDetailViewController *detailViewController; 
@end 

WWFMasterViewController.m:

#import "WWFMasterViewController.h" 
#import "WWFDetailViewController.h" 

@interface WWFMasterViewController() 
@property (nonatomic,strong) NSArray * arr; 
@end 

@implementation WWFMasterViewController 
@synthesize arr; 

- (void)awakeFromNib 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     self.clearsSelectionOnViewWillAppear = NO; 
     self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 
    } 
    [super awakeFromNib]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [email protected][@"First",@"Second",@"Third",@"Fourth",@"Fifth"]; 
    self.detailViewController = (WWFDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; 
} 

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

#pragma mark - Table View 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return arr.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    cell.textLabel.text = arr[indexPath.row]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     self.detailViewController.detailItem = arr[indexPath.row]; 
    } 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     [[segue destinationViewController] setDetailItem:arr[indexPath.row]]; 
    } 
} 

@end 

WWFDetailViewController.h:

#import <UIKit/UIKit.h> 
@interface WWFDetailViewController : UIViewController <UISplitViewControllerDelegate> 
@property (strong, nonatomic) id detailItem; 
@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel; 
@end 

WWFDetai lViewController.m:

#import "WWFDetailViewController.h" 

@interface WWFDetailViewController() 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
- (void)configureView; 
@end 

@implementation WWFDetailViewController 

#pragma mark - Managing the detail item 

- (void)setDetailItem:(id)newDetailItem 
{ 
    if (_detailItem != newDetailItem) { 
     _detailItem = newDetailItem; 
     [self configureView]; 
    } 

    if (self.masterPopoverController != nil) { 
     [self.masterPopoverController dismissPopoverAnimated:YES]; 
    }   
} 

- (void)configureView 
{ 
    if (self.detailItem) { 
     self.detailDescriptionLabel.text = [self.detailItem description]; 
    } 
} 

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

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

#pragma mark - Split view 

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 
{ 
    barButtonItem.title = NSLocalizedString(@"Master", @"Master"); 
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 
    self.masterPopoverController = popoverController; 
} 

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    [self.navigationItem setLeftBarButtonItem:nil animated:YES]; 
    self.masterPopoverController = nil; 
} 

- (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { 
    return YES; 
} 

@end 

我如何寫一個方法/消息驗證碼,將顯示/隱藏主列表?

TIA

+0

你創建一個使用蘋果主從模板,看看它是如何工作的一個項目? – Wain

+0

是的,我做到了。我錯過了什麼? – Jimmery

+0

在iPhone上,只需按下/彈出控制器。在iPad上,您應該有一個導航欄按鈕。 – Wain

回答

1

好的,我發現如何在iOS6中隱藏主視圖控制器。這是我使用的代碼:

[self.masterPopoverController dismissPopoverAnimated:YES]; 

而對於展示我想這個功能需要presentPopoverFromBarButtonItem:permittedArrowDirections:animated:,但我沒有測試此而主視圖控制器。

此代碼進入DetailViewController。

2
Use following method to hide the split view: 

.h file must contain UISplitViewControllerDelegate 

// In split delegate 
- (void)hideMaster { 

    [self.splitViewController.view setNeedsLayout]; 
    self.splitViewController.delegate = nil; 
    self.splitViewController.delegate = self; 

    [self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0]; 

}// end hideMaster 


-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 

    return YES; 

} 

Use following method to show the split view: 

// In split delegate 
- (void)hideMaster { 

    [self.splitViewController.view setNeedsLayout]; 
    self.splitViewController.delegate = nil; 
    self.splitViewController.delegate = self; 

    [self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0]; 

}// end hideMaster 


-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 

    return NO; // Important when show the split view again 

} 

// vKj

相關問題