如何在拆分视图iOS中将不同视图加载到详细视图

时间:2012-08-18 07:34:26

标签: ios uisplitviewcontroller ipad

我想知道如何从rootview中将不同的视图加载到detailView中。

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {

        if (indexPath.row == 0) {
            SecondViewController *svc = [[SecondViewController alloc] init];

            //[self.navigationController pushViewController:svc animated:YES]; 

        }


}

2 个答案:

答案 0 :(得分:4)

splitviewcontroller包含2个视图的数组,一个是根视图,另一个是详细视图,您可以更改此数组中的视图。如果您分配并初始化一个视图并将其替换为这两个视图中的任何一个,那么此视图将替换splitviewcontroller中的当前视图。

使用此代码为rootview的不同单元格加载不同的视图。更改rootview的didSelectRowAtIndexPath方法如下:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UIViewController  *localdetailViewController = nil;

    if (indexPath.row==0)
    {

    DetailViewController *detailView=[[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];

    localdetailViewController=detailView;

    detailView=nil;

    }

    if (indexPath.row==1)
    {

    SecondViewController *secondDetailView=[[SecondViewController alloc] initWithNibName:@"SecondDetailViewController" bundle:nil];

    localdetailViewController=secondDetailView;
    secondDetailView = nil;
    }

    UINavigationController *navController=[[UINavigationController alloc] init];

    [navController pushViewController:localdetailViewController animated:YES];

    YourSplitViewAppDelegate *delegate=[[UIApplication sharedApplication] delegate];

    NSArray *viewControllers=[[NSArray alloc] initWithObjects:[delegate.splitViewController.viewControllers objectAtIndex:0],navController,nil];

    delegate.splitViewController.viewControllers = viewControllers;

    [localdetailViewController release];

    [navController release];

    }

答案 1 :(得分:0)

我的解决方案是使用Xcode 7.1.1作为通用应用,使用Storyboard,Auto Layout和Size Classes,为iOS 9构建...

我在当前/原始(不是替换/新/第二)详细视图控制器{{1}中使用了Midhun MP answer ...的版本方法:

显然首先导入控制器的正确头文件:

#import "NEW_DetailViewController.h"

然后在viewDidLoad方法中:

- (void)viewDidLoad {
    [super viewDidLoad];

    <<OTHER_CODE>>

    if (<<INSERT_THE_LOGIC_YOU_NEED_TO_TRIGGER_THE_REPLACEMENT_DETAIL_VC>>) {
        NEW_DetailViewController *viewNewDetailVC = [[NEW_DetailViewController alloc] initWithNibName:@"NEW_DetailViewController" bundle:nil];

        UINavigationController *navController = [[UINavigationController alloc] init];
        [navController pushViewController:viewNewDetailVC animated:YES];

        NSArray *arraySplitViewControllers = [[NSArray alloc] initWithObjects:[self.splitViewController.viewControllers objectAtIndex:0],navController,nil];

        self.splitViewController.viewControllers = arraySplitViewControllers;
    }
}

注意我可以在不加载XIB文件的情况下使此代码正常工作,使用[[UIViewController alloc] init]代替[[NEW_DetailViewController alloc] initWithNibName:@"NEW_DetailViewController" bundle:nil]在代码中构建整个替换详细信息VC,但却感到沮丧我无法加载XIB文件,所以我坚持......

在尝试解决成功加载XIB文件作为拆分视图控制器中的替换详细视图控制器的问题时,我尝试了许多不同SO答案的许多变体。

最后this answer Travis M向我提供了我需要的提示......

删除您迄今为止尝试创建新的XIB文件和UIViewController的子类的所有努力!

创建一个新文件并使其成为UIViewController的子类。见截图:

Screenshot of new subclass of new UIViewController

重要确保选中复选框&#34;同时创建XIB文件&#34;。

您不需要修改UIViewController的新子类,除非您想要编写视图的内容。我只需要为我的解决方案添加UILabel,我使用Interface Builder完成了这项工作。

请确保按照上面的示例在代码中引用替换视图控制器NEW_DetailViewController

那就是它!

在您的XIB文件中,您应该得到以下结果:

Files Owner -> subclass: NEW_DetailViewController

Files Owner -> Outlet:view

View -> Referencing Outlet:view