如何在拆分视图iOS中将不同的视图加载到详细视图
Posted
技术标签:
【中文标题】如何在拆分视图iOS中将不同的视图加载到详细视图【英文标题】:How to load a different view to detail view in split view iOS 【发布时间】:2012-08-18 07:34:25 【问题描述】:我想知道如何将不同的视图从 rootview 加载到 detailView..
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.row == 0)
SecondViewController *svc = [[SecondViewController alloc] init];
//[self.navigationController pushViewController:svc animated:YES];
【问题讨论】:
我不明白你的问题。 好吧.. 我有一个 splitViewController,它带有 rootViewController 和 detailViewController。我想在选择一行时将不同的视图控制器加载到 detailViewController 中.. 【参考方案1】: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];
【讨论】:
感谢它正常工作,除了我从表格视图中选择单元格后我的主视图控制器没有隐藏。知道出了什么问题吗?【参考方案2】:我的解决方案是使用 Xcode 7.1.1 作为通用应用程序,使用情节提要、自动布局和大小类,为 ios 9 构建...
我在当前/原始(不是替换/新/第二个)细节视图控制器的viewDidLoad
方法中使用了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 文件的情况下使这段代码工作,在代码中构建整个替换细节 VC,使用 [[UIViewController alloc] init]
而不是 [[NEW_DetailViewController alloc] initWithNibName:@"NEW_DetailViewController" bundle:nil]
,但我很沮丧,因为我做不到XIB 文件加载,所以我坚持...
我尝试了许多不同 SO 答案的多种变体,试图解决成功加载 XIB 文件作为拆分视图控制器中的替换细节视图控制器的问题。
最后this answer Travis M 给了我我需要的提示...
删除您迄今为止为创建新的 XIB 文件和 UIViewController
的子类所做的所有努力!
创建一个新文件并使其成为 UIViewController 的子类。见截图:
重要提示确保选中“同时创建 XIB 文件”复选框。
您不需要修改UIViewController
的新子类,除非您想对视图的内容进行编码。我只需要为我的解决方案添加UILabel
,我使用Interface Builder 完成了这项工作。
确保按照我上面的示例在代码中引用替换视图控制器 NEW_DetailViewController
。
就是这样!
在您的 XIB 文件中,您应该得到以下内容:
【讨论】:
以上是关于如何在拆分视图iOS中将不同的视图加载到详细视图的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS7 中将多个图像加载到单个视图控制器中的方向/分辨率问题
iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?