如何从包含我的UIViewController的UITableViewController中显示一个新视图?

时间:2013-01-22 23:44:17

标签: ios objective-c view properties

我在UITableViewController内有一个UIViewController。虽然这个表视图控制器是唯一涉及的,但是当用户点击一行时,它正在推动视图。但是,自从我将它移动到UIViewController中包含的两个中的一个之后,行的突然显然什么也没做。

tried searching around并且我不是第一个遇到这个问题的人,但是没有一个答案符合我的情况,或者问题没有合适的答案。这个链接是我找到的最接近的,但我没有使用故事板 - 我正在使用单独的XIB。

那么如何在viewcontroller中从viewcontroller推送新视图?

回顾一下:

  1. 这就是我所拥有的,并且将用户带到新屏幕时效果很好!

    // Normal table behavior, as illustrated by [another question][2].
    
    - (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        SomeView *detailViewController = [[SomeView alloc] initWithNibName:@"SomeView" bundle:nil];
    
        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:detailViewController animated:YES];
    }
    
  2. 现在我将viewcontroller作为视图中的属性 - 上面的代码位于tableviewcontroller的文件中而不是“main”视图中,不会导致出现新的屏幕了!


  3. 感谢您的评论!这里有一些代码来澄清我的场景。

    1. 控制器内的控制器。这是我用来测试概念的测试项目中的文件。在这种情况下,我在tableview控制器中有一个tableview控制器。

      @interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
      
      // This is the controller within the controller
      @property IBOutlet SecondTableViewController *secondTableController;
      @property IBOutlet UITableView *secondTable;
      
    2. 我的SecondTableViewController有这个有趣的地方。

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      {
          // Navigation logic may go here. Create and push another view controller.
      
          UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
          // ...
          // Pass the selected object to the new view controller.
          [manualViewControllerParent.navigationController  pushViewController:detailViewController animated:YES];
      }
      
    3. 用户与之交互的视图已连接到SimpleTableViewController。这样,SecondTableViewController就在“SimpleTableViewController内”。如果您想了解更多详情,请随时发表评论!


      我把我的测试/概念项目放在github上。 https://github.com/hyliandanny/TableViewCeption

2 个答案:

答案 0 :(得分:3)

您需要使用自定义容器控制器来执行您想要的操作。如果您使用故事板,这将是最简单的,但您也可以使用xibs在代码中执行此操作。外部控制器应该是UIViewController,而不是表视图控制器。你可以这样做(在外部控制器中):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
    [self addChildViewController:detailViewController];
    detailViewController.view.frame = set the frame to what you want;
    [self.view addSubview:detailViewController.view];
    [detailViewController didMoveToParentViewController:self];
}

您应该阅读Apple的自定义容器控制器文档。

答案 1 :(得分:0)

您需要确保:

  • 您的UITableView代表已连接到您的控制器。否则它就不会打电话给didSelectRow。您可以在xib或viewDidLoad方法中执行此操作。
  • 你的self.navigationController不是nil
  • 您的detailViewController不是nil

我还认为你的意思是你UITableView内有UIViewControllerUITableView仅是视图,而UITableViewController是控制器。你不能在另一个控制器内部安装一个控制器。