Byt*_*Guy 6 objective-c master-detail ipad uisplitviewcontroller ios
我有一个主题细节iPad界面设置与故事板,以在细节视图控制器上提供替换segue.这可以很好地替换细节控制器,但在某些情况下缺少显示主控制器的条形按钮.
如果我在纵向中执行segue,则会丢失条形按钮,因为willHideViewController:从不调用委托方法.prepareForSegue:从主服务器调用时,我将委托设置为新的详细信息控制器.
当按钮丢失时,我可以将iPad旋转到横向然后再回到纵向,然后会出现按钮.
在 prepareForSegue:
UINavigationController *nav = [segue destinationViewController];
UIViewController *destinationViewController = nav.topViewController;
if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) {
self.splitViewController.delegate = destinationViewController;
}
else {
self.splitViewController.delegate = nil;
}
Run Code Online (Sandbox Code Playgroud)
在细节控制器中:
#pragma mark - Split view
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"MasterButton", @"Master");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}
Run Code Online (Sandbox Code Playgroud)
小智 0
我遇到了同样的情况,我通过在prepareForSegue方法中将barButton值从当前detailViewController(正在被替换)传递到目标detailViewController(正在替换的)来解决。
步骤是:
将 barButton 作为属性存储在 UISplitViewDelegate 方法中
因此,在 DetailViewControllers 中添加:
@property (nonatomic, strong) UIBarButtonItem *rootPopoverButtonItem;
Run Code Online (Sandbox Code Playgroud)
在委托方法中:
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:
(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
barButtonItem.title = @"Master";
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.rootPopoverButtonItem = barButtonItem; //Storing the barButton
self.masterPopoverController = pc;
}
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:
(UIViewController *)aViewController
invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.rootPopoverButtonItem = nil; //Storing the barButton
self.masterPopoverController = nil;
}
Run Code Online (Sandbox Code Playgroud)现在在您的 - (void)viewDidLoad 中读取存储的值并显示。如果 barButton 显示在要替换的 viewController 中,则当前 VC 将显示它。
[self.navigationItem setLeftBarButtonItem:self.rootPopoverButtonItem animated:YES];
Run Code Online (Sandbox Code Playgroud)现在在主视图控制器中的prepareForSegue中包含以下内容...
UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController;
UINavigationController *currentNavigationController = [splitViewController.viewControllers lastObject];
UINavigationController *navigationController = [segue destinationViewController];
DetailViewController *destinationDetailViewController=(DetailViewController *)[navigationController topViewController];
DetailViewController *currentDetailViewController =(DetailViewController *)[currentNavigationController topViewController];
splitViewController.delegate = destinationDetailViewController;//Needed for passing the delegate
if(currentDetailViewController.rootPopoverButtonItem !=nil)
{
destinationDetailViewController.rootPopoverButtonItem = currentDetailViewController.rootPopoverButtonItem;
}
Run Code Online (Sandbox Code Playgroud)这不是一个优雅的方法..但对我来说没有太多开销。如果您可以使用 SubstitutableDetailViewController 协议,还有其他方法(更优雅)可用。但看起来工作量太大了,而且超出了能力范围。