ios - MGSplitViewController 不是 RootView,而是在 UIViewController 中

标签 ios uitabbarcontroller uisplitview

我是 iOS 编程的新手(来自 Java/C++)。我正在尝试使用 TabBarController 设置一个应用程序,其中一个选项卡应该是 SplitView。我已经完成我的研究并且我知道 UISplitview 将无法工作并且人们建议使用 MGSplitViewController 的任何地方。我看过该演示,但我无法弄清楚如何在不显示应用程序 Root View 的情况下使用它,并且找不到任何可以提供帮助的示例代码 下面是我在一个单独的 UIViewController 类中对演示中的类所做的操作,然后我将其添加到 TabBarController:这是我的类:

#import <UIKit/UIKit.h>
#import "MGSplitCornersView.h"
#import "RootViewController.h"
#import "DetailViewController.h"



@interface ChannelViewController : UIViewController {
    MGSplitViewController *splitViewController;
    RootViewController *rootViewController;
    DetailViewController *detailViewController;

}

@property (nonatomic, retain) MGSplitViewController *splitViewController;
@property (nonatomic, retain) RootViewController *rootViewController;
@property (nonatomic, retain) DetailViewController *detailViewController;


@end

这是我拼命尝试设置它

- (id)initWithTabBar
{
    self = [super init];

    //this is the label on the tab button itself
    self.title = @"SplitView";

    //use whatever image you want and add it to your project
    //self.tabBarItem.image = [UIImage imageNamed:@"name_gray.png"];

    // set the long name shown in the navigation bar at the top
    self.navigationItem.title=@"Nav Title";

    self.splitViewController = [[MGSplitViewController alloc] init];
    self.rootViewController = [[RootViewController alloc] init];
    self.detailViewController = [[DetailViewController alloc] init];

    [self.splitViewController setDetailViewController:detailViewController];
    [self.splitViewController setMasterViewController:rootViewController];

    [self.view addSubview:splitViewController.view];

    [self.rootViewController performSelector:@selector(selectFirstRow) withObject:nil afterDelay:0];
    [self.detailViewController performSelector:@selector(configureView) withObject:nil afterDelay:0];

    if (NO) { // whether to allow dragging the divider to move the split.
    splitViewController.splitWidth = 15.0; // make it wide enough to actually drag!
    splitViewController.allowsDraggingDivider = YES;
    }

    return self;
}

我想我对代表做错了什么?还是我混淆了其他东西? 演示是否在 IB 中执行我在代码中看不到的操作? 我得到了 Split View,但没有内容,尤其是没有带有演示附带按钮的导航栏。

非常感谢提示或示例代码!

最佳答案

好的,曼尼,我们开始吧。这是我的界面工作代码:

#import <UIKit/UIKit.h>
#import "MGSplitViewController.h"
#import "ecbView.h"
#import "ecbCalc.h"

@interface splitMain : MGSplitViewController <UIPopoverControllerDelegate,
                                              MGSplitViewControllerDelegate>
{
    IBOutlet UIPopoverController*       popoverController;
    IBOutlet UINavigationController*    naviController;
    IBOutlet ecbCalc*                   viewCalcLeft;
    IBOutlet ecbView*                   euroRatesRight;
             UIBarButtonItem*           savedButtonItem;
             BOOL                       keepMasterInPortraitMode;
             BOOL                       memoryWasDropped;
             BOOL                       viewLoaded;
}

@property (nonatomic, retain) UIPopoverController* popoverController;
@property (nonatomic, retain) UINavigationController* naviController;
@property (nonatomic, retain) ecbCalc* viewCalcLeft;
@property (nonatomic, retain) ecbView* euroRatesRight;
@property (nonatomic, retain) UIBarButtonItem* savedButtonItem;
@property (nonatomic, readonly) BOOL keepMasterInPortraitMode;
@property (nonatomic, readonly) BOOL memoryWasDropped;
@property (nonatomic, readonly) BOOL viewLoaded;

- (void)dismissPopoverController: (BOOL)animated;
- (void)settingsChanged;

@end

这里是实现文件的摘录:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super initWithCoder:aDecoder]))
    {
        // my initialization...
    }

    return self;
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
    CGRect  rectFrame = CGRectMake(0.0, 20.0, 768.0, 1004.0 - 48.0);    // being above a tab bar!

    viewLoaded     = NO;
    self.view      = [[UIView alloc] initWithFrame:rectFrame];
    viewCalcLeft   = [[ecbCalc alloc] initWithNibName:@"ecbCalc" bundle:nil];
    euroRatesRight = [[ecbView alloc] initWithNibName:@"ecbView-iPad" bundle:nil];
    naviController = [[UINavigationController alloc] initWithRootViewController:self.viewCalcLeft];
    naviController.navigationBar.barStyle = UIBarStyleBlack;
    naviController.title = nil;
    viewCalcLeft.title   = NSLocalizedString(@"BtnTitleCalc",  @"");
    viewCalcLeft.view.hidden = NO;

    NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];

    if ([prefs objectForKey:@"iPadAlwaysSplitTableView"] != nil)
        self.keepMasterInPortraitMode = [prefs boolForKey:@"iPadAlwaysSplitTableView"];
    else
        self.keepMasterInPortraitMode = YES;

    NSArray*    theViewControllers = [NSArray arrayWithObjects:self.naviController, self.euroRatesRight, nil];

    [self setViewControllers:theViewControllers];
    [self setDelegate:self];
    [self setShowsMasterInPortrait:keepMasterInPortraitMode];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    // protection because this one is called twice
    if (viewLoaded)
        return;

    [super viewDidLoad];

    if (memoryWasDropped)
    {
        if (!self.keepMasterInPortraitMode && UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
        {
            // recreate popover controller
            self.popoverController = [[UIPopoverController alloc] initWithContentViewController:self.viewCalcLeft];
        }
    }

    viewLoaded = YES;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    memoryWasDropped = YES;

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    [self dismissPopoverController:NO];

    self.popoverController = nil;
    self.naviController    = nil;
    self.viewCalcLeft      = nil;
    self.euroRatesRight    = nil;
    viewLoaded = NO;
}

我的 MainWindow.xib 有一个 UITabBarController,splitMain 的按钮是为这个类配置的,但是 xib 条目是空的。所以创建必须通过loadView。也许我可以在 loadView 中完成 viewDidLoad 的工作......但是我必须保护 viewDidLoad 不被调用两次。一旦从 MGSplitViewController 类实例化 View ,就会在 loadView 中发生这种情况,因为那里的 initWithCoder 正在调用[self setup]。在那个函数中,frame rect 是用 self.view.bounds 计算的,所以 viewDidLoad 被再次调用,因为 View 还不存在。也许可以在 MGSplitViewController.m 中实现一种解决方法,但我太懒了。

要在选项卡栏 Controller 上运行此功能,请确保您提交了在 MGSplitViewController 的 git 页面上发布的大部分更改。祝你好运。

关于ios - MGSplitViewController 不是 RootView,而是在 UIViewController 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039629/

相关文章:

ios - UIAccessibility 焦点与 UITabBarController

swift - 如何使用 Swift 显示工具栏按钮并将其添加到 UITableViewController

ios - 具有 UITabBar 行为的 UISplitview

ios - 如何获取 HockeyApp 的唯一用户 ID?

ios - Swift 中的毫秒数

ios - 如何以编程方式从位于导航 Controller 内部的 View Controller 移动选项卡栏?

c# - 如何缩小 UISplitView

ios - 如何在不同 Storyboard 的标签栏上显示 Split View Controller ?

ios - swift中错误和异常的区别

ios - Swift 在 UITextField 中添加图标/图像