- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 iOS 8 中, View Controller 现在可以调用 showDetailViewController:sender:
让系统确定正确的 View Controller 来呈现细节 View Controller 。
在我的应用程序中,我有一个 UISplitViewController,它在其 viewControllers 数组中包含两个 UINavigationControllers。第一个 UINavigationController 包含我的“主” View ,它是 UITableViewController 的子类。第二个 UINavigationController 包含我的“详细信息” View 。
由于我试图使这项工作普遍适用,所以我尝试使用 showDetailViewController:sender:
来显示详细 View :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
[self showDetailViewController:self.itemVC sender:self];
}
当 self.splitViewController.collapsed == YES
时,这适用于 Horizontal Compact 特征(iPhone 风格),但当特征为 Regular(iPad,未折叠)时则不然。在 iPad 上,它将细节 UINavigationController 替换为裸细节 View Controller (而不是替换 UINavigationController 的 viewControllers 数组)。
为了解决这个问题,我测试了它是否折叠,如果没有,我在显示它之前将细节 View Controller 包装在另一个 UINavigationController 中:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
UIViewController *vcToShow;
// For whatever reason, when not collapsed, showDetailViewController replaces the detail view, doesn't push onto it.
if (self.splitViewController.collapsed) {
vcToShow = self.itemVC;
} else {
vcToShow = [[UINavigationController alloc] initWithRootViewController:self.itemVC];
}
[self showDetailViewController:vcToShow sender:self];
}
我想或者我可以只配置 self.itemVC
并避免调用 showDetailViewController:sender:
当 self.splitViewController.collapsed == NO
:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
// For whatever reason, when not collapsed, showDetailViewController replaces the detail view, doesn't push onto it.
if (self.splitViewController.collapsed) {
[self showDetailViewController:vcToShow sender:self];
}
}
但是,这感觉像是违背了 showDetailViewController:sender:
的目的,即放松 self
与 View 层次结构的其余部分之间的耦合。
有没有更好的方法来处理这个问题?
最佳答案
在 showDetailViewController:sender:
中,根据 collapse
属性,您需要创建要在细节中显示的 Controller 。
例如在横向模式的 iPad 上,它已经从 Storyboard创建了细节 View Controller ,但在折叠模式的 iPhone 5 上, View Controller 尚不存在。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UINavigationController *detail;
ImageViewController *imageVC;
// on the iPhone (compact) the split view controller is collapsed
// therefore we need to create the navigation controller and its image view controllerfirst
if (self.splitViewController.collapsed) {
detail = [[UINavigationController alloc] init];
imageVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ImageViewController"];
[detail setViewControllers:@[imageVC] animated: NO];
}
// if the split view controller shows the detail view already there is no need to create the controllers
else {
id vc = self.splitViewController.viewControllers[1];
if ([vc isKindOfClass:[UINavigationController class]]) {
detail = (UINavigationController *)vc;
imageVC = [detail.viewControllers firstObject];
}
}
[self prepareImageViewController:imageVC forPhoto:self.photos[indexPath.row]];
// ask the split view controller to show the detail view
// the controller knows on iPhone and iPad how to show the detail
[self.splitViewController showDetailViewController:detail sender:self];
}
希望这能解决您的问题。
关于ios - 在 UISplitViewController 中,无法使 showDetailViewController :sender: push onto detail navigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106548/
我正在使用 showDetailViewController 来显示 Web View ,但我在关闭它时遇到问题。 如何关闭它? 这就是我的称呼 override func tableView(tab
我只是想知道是否可以在没有动画的情况下显示细节 View Controller (从右侧滑入窗口)。我期待有某种动 Canvas 尔参数,但似乎没有。 这就是我的全部: [self.splitView
我有一个主页,当按下某个按钮时,它会将您带到一个 Split View,左侧(主)侧是一个表格,右侧(详细)侧是一个显示详细信息的 View 。该应用程序在模拟器上运行良好,但在我的 iPad min
在我的主视图中,我有 4 个静态表行。其中 2 行向下钻取到主视图中的详细 View ,另外 2 行替换详细 View 的内容。我通过适本地调用 showViewController() 和 show
在 iOS 8 中, View Controller 现在可以调用 showDetailViewController:sender: 让系统确定正确的 View Controller 来呈现细节 Vi
我是一名优秀的程序员,十分优秀!