iOS: UISplitViewController show/hide 主视图按钮不起作用
iOS: UISplitViewController show/hide master view button doesn't work
我在学习objective C。现在我对 UISplitViewController 和 show/hide 主视图按钮感到好奇。我看过很多教程,但我做错了什么,我不知道是什么。我的按钮不隐藏主视图。我在两天内彻底崩溃了。现在我构建了这个示例项目来征求您的意见。
在我的模式中,我有:TabBarVC、SplitVC、TableViewVC 和 ViewVC。所有控制器都是我的习惯。
MyTabBarViewController 首先出现。我有带有 UISplitViewController 的选项卡。
MySplitViewController.m
#import "MySplitViewController.h"
#import "MyTabBarViewController.h"
#import "MyDetailViewController.h"
@interface MySplitViewController ()
@end
@implementation MySplitViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyTabBarViewController *masterVC = [self.storyboard instantiateViewControllerWithIdentifier:@"myTableVC"];
MyDetailViewController *detailVC = [self.storyboard instantiateViewControllerWithIdentifier:@"myDetailVC"];
NSArray *newViewControllersArray = [NSArray arrayWithObjects:masterVC, detailVC, nil];
self.viewControllers = newViewControllersArray;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.dataArray = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.dataArray count];
}
//configure the cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
cell.textLabel.text = [self.dataArray objectAtIndex:indexPath.row];
return cell;
}
@end
MyDetailViewController.h
#import <UIKit/UIKit.h>
@interface MyDetailViewController : UIViewController <UISplitViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *showHideMasterVC;
@property (nonatomic, strong) UIPopoverController *popover;
@end
MyDetailViewController.m
#import "MyDetailViewController.h"
@interface MyDetailViewController ()
@end
@implementation MyDetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)splitViewController:(UISplitViewController *)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
//Grab a reference to the popover
self.popover = pc;
}
-(void)splitViewController:(UISplitViewController *)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
//Nil out the pointer to the popover.
_popover = nil;
}
@end
这是我的整个项目的故事板:MyProject
抱歉,代码太多,但请帮助我,否则我会发疯的。谢谢!
PS 顺便说一下,是否可以在 NavigationController 之外设置 show/hide 主视图按钮,例如在某些视图上?
现在我明白了 - (void)splitViewController(UISplitViewController *)svc willHideViewController 和 - (void)splitViewController(UISplitViewController *)svc willShowViewController 在 iOS8.
中被弃用
所以有人可以更正我的项目,我应该怎么做才能解决我的问题?
我认为最简单的方法是在您的 MyDetailViewController viewDidLoad
中添加 self.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
。这将显示 show/hide MasterDetailViewController 按钮。
并且您的 - (void)splitViewController(UISplitViewController *)svc willHideViewController
和 - (void)splitViewController(UISplitViewController *)svc willShowViewController
在 iOS8 中已弃用。
我有一个类似的问题,对我来说,我通过简单地使用主从应用程序模板创建我的项目来解决它。它默认带有 show/button 和 - (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController
。如果您将 TabBarViewController 用作 rootViewController,那么您可能希望将其设置为 applicationDidFinishLaunchingWithOptions
中的 rootViewController。希望这能帮助解决您的问题。
编辑:
PS 顺便说一下,是否可以在 NavigationController 之外设置 show/hide 主视图按钮,例如在某些视图上?
首先在故事板中创建一个 UIButton。将它连接到 IBAction。
- (IBAction)buttonAction:(id)sender {
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
[self.splitViewController.displayModeButtonItem action];
}
这应该有效。
我在学习objective C。现在我对 UISplitViewController 和 show/hide 主视图按钮感到好奇。我看过很多教程,但我做错了什么,我不知道是什么。我的按钮不隐藏主视图。我在两天内彻底崩溃了。现在我构建了这个示例项目来征求您的意见。 在我的模式中,我有:TabBarVC、SplitVC、TableViewVC 和 ViewVC。所有控制器都是我的习惯。 MyTabBarViewController 首先出现。我有带有 UISplitViewController 的选项卡。
MySplitViewController.m
#import "MySplitViewController.h"
#import "MyTabBarViewController.h"
#import "MyDetailViewController.h"
@interface MySplitViewController ()
@end
@implementation MySplitViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyTabBarViewController *masterVC = [self.storyboard instantiateViewControllerWithIdentifier:@"myTableVC"];
MyDetailViewController *detailVC = [self.storyboard instantiateViewControllerWithIdentifier:@"myDetailVC"];
NSArray *newViewControllersArray = [NSArray arrayWithObjects:masterVC, detailVC, nil];
self.viewControllers = newViewControllersArray;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.dataArray = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.dataArray count];
}
//configure the cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
cell.textLabel.text = [self.dataArray objectAtIndex:indexPath.row];
return cell;
}
@end
MyDetailViewController.h
#import <UIKit/UIKit.h>
@interface MyDetailViewController : UIViewController <UISplitViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *showHideMasterVC;
@property (nonatomic, strong) UIPopoverController *popover;
@end
MyDetailViewController.m
#import "MyDetailViewController.h"
@interface MyDetailViewController ()
@end
@implementation MyDetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)splitViewController:(UISplitViewController *)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
//Grab a reference to the popover
self.popover = pc;
}
-(void)splitViewController:(UISplitViewController *)svc
willShowViewController:(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
//Nil out the pointer to the popover.
_popover = nil;
}
@end
这是我的整个项目的故事板:MyProject
抱歉,代码太多,但请帮助我,否则我会发疯的。谢谢! PS 顺便说一下,是否可以在 NavigationController 之外设置 show/hide 主视图按钮,例如在某些视图上?
现在我明白了 - (void)splitViewController(UISplitViewController *)svc willHideViewController 和 - (void)splitViewController(UISplitViewController *)svc willShowViewController 在 iOS8.
中被弃用所以有人可以更正我的项目,我应该怎么做才能解决我的问题?
我认为最简单的方法是在您的 MyDetailViewController viewDidLoad
中添加 self.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
。这将显示 show/hide MasterDetailViewController 按钮。
并且您的 - (void)splitViewController(UISplitViewController *)svc willHideViewController
和 - (void)splitViewController(UISplitViewController *)svc willShowViewController
在 iOS8 中已弃用。
我有一个类似的问题,对我来说,我通过简单地使用主从应用程序模板创建我的项目来解决它。它默认带有 show/button 和 - (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController
。如果您将 TabBarViewController 用作 rootViewController,那么您可能希望将其设置为 applicationDidFinishLaunchingWithOptions
中的 rootViewController。希望这能帮助解决您的问题。
编辑:
PS 顺便说一下,是否可以在 NavigationController 之外设置 show/hide 主视图按钮,例如在某些视图上?
首先在故事板中创建一个 UIButton。将它连接到 IBAction。
- (IBAction)buttonAction:(id)sender {
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
[self.splitViewController.displayModeButtonItem action];
}
这应该有效。