如何手动创建UISplitView?

时间:2010-05-18 06:00:25

标签: objective-c cocoa-touch ipad uisplitviewcontroller

我有一个应用程序将导航到UISplitView(完全在另一个视图中),如下所示:

- (void) switchToMyDayView {
    NSLog(@"Show My Day Screen");

    if (self.myDayController.view.superview == nil) {
        if (self.myDayController == nil) {
            MyDayController *myController = [[MyDayController alloc] initWithNibName:@"MyDay" bundle:nil];
            self.myDayController = myController;
            [myController release];
        }

        [homeScreenController.view removeFromSuperview];
        [self.view insertSubview:self.myDayController.view atIndex:0];
    }
}

在主导航界面上完成了哪些操作

现在,MyDayController有一个名为MyDay.xib的XIB,它包含以下项目:

  

文件所有者:MyDayController

     

第一响应者:UIResponder

     

拆分视图控制器

 ---->Navigation Controller

         ---->Navigation Bar

         ----> Table View Controller

                 ----> Navigation Item

 ---->View Controller

所以,我需要更多的组件,我需要一个UITableViewController和一个UISplitViewControllerDelegate正确吗?

我打算在我的MyDayController中实现这些协议,这是一种标准吗?

因此,在上面的代码之后,我收到一个错误:

- [UIViewController _loadViewFromNibNamed:bundle:]加载了“MyDay”笔尖,但未设置视图插座。

那么,如何使用UISplitViewController修复它?我知道UISplitViewController有一个view属性,但我不能用它/在IB中连接它可以吗?

非常感谢

标记

4 个答案:

答案 0 :(得分:5)

您不应该继承UISplitViewController的子类。您的“MyDayController”课程中有什么行为? UISplitViewController基本上只是处理为您布置主视图和详细视图,因此您的责任是实现这些控制器。

如果拆分视图位于应用程序的顶层,则可以将其添加到应用程序的主窗口笔尖。如果不是,只需以编程方式创建它:

- (void) switchToMyDayView {
    NSLog(@"Show My Day Screen");

    if (self.myDayController == nil) {
        YourMasterViewController *masterViewController = [[YourMasterViewController alloc] initWithNibName:@"MasterView" bundle:nil];
        YourDetailViewController *detailViewController = [[YourDetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
        UISplitViewController *myController = [[UISplitViewController alloc] init;
        myController.viewControllers = [NSArray arrayWithObjects:masterViewController, detailViewController, nil];
        [masterViewController release];
        [detailViewController release];

        self.myDayController = myController;
        [myController release];         
    }

    [homeScreenController.view removeFromSuperview];
    [self.view insertSubview:self.myDayController.view atIndex:0];
}

您也不需要self.myDayController.view.superview == nil的测试,因为它隐含在self.myDayController == nil

答案 1 :(得分:1)

谢谢Christopher Pickslay。 这个解决方案适合我,但我必须解决你给的东西。 请参阅下面的代码。

委派文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    LeftViewController *leftViewController = [[LeftViewController alloc] init];// initWithNibName:@"LeftViewController" bundle:nil];
    RightViewController *rightViewController = [[RightViewController alloc] initWithNibName:@"RightViewController" bundle:nil];
    UISplitViewController *myController = [[UISplitViewController alloc] init];
    myController.viewControllers = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];

    self.window.rootViewController = myController;

    [self.window makeKeyAndVisible];
    return YES;
}

希望这有帮助。

答案 2 :(得分:0)

我已经回答了类似的问题here

希望它有所帮助。

谢谢, Madhup

答案 3 :(得分:0)

如果您想在主设备和细节中使用导航控制器创建,那么您可以执行此操作

self.rootViewController=[[RootViewController alloc]init];
    self.detailViewController=[[FirstDetailViewController alloc]init];

    UINavigationController *rootNav=[[UINavigationController alloc]initWithRootViewController:rootViewController];
    UINavigationController *detailNav=[[UINavigationController alloc]initWithRootViewController:detailViewController];

    self.splitViewController.viewControllers=[NSArray arrayWithObjects:rootNav,detailNav,nil];
    self.splitViewController.delegate=self.detailViewController;