2012-08-25 31 views
1

我在xCode 4.3编码 这是我的第一个应用程序。如何替换UIViewController中的UITableView选择

我有一个UIViewController,公司的标志在上面,然后搜索栏,然后UITableView在中间(与产品名称)和底部页脚图像。现在我希望在UITableView上单击一个项目时,只有TableView将替换为显示产品详细信息的视图。

现在我可以用下面的代码替换整个视图:

if (!self.prodDetailViewController_) 
{   
    self.prodDetailViewController_ = [[PCS1ProdDetailViewController alloc] initWithNibName:@"PCS1ProdDetailViewController" bundle:[NSBundle mainBundle]]; 
} 
[self presentModalViewController:prodDetailViewController_ animated:YES]; 

,但它只是增加了我的工作,因为我将不得不重做顶栏和底栏(这在整个应用程序保持不变)在我所有的意见。 有没有一种方法,我只是将我的主UIViewController的元素更改为UITableView。

感谢您的期待。

回答

0

我打算假设您可以在此处使用iOS 5功能。你可以做的是实现一个容器视图控制器 - 就像UINavigationController一样,但是使用你自己的视图布局,这样你就可以保持标识,搜索栏等全部就位,并且只在视图的一部分视图之间转换。

我创建了一个名为ViewController的新容器视图控制器。它有一个UIView插座containerView,它是在.xib文件中设置的,以及顶部栏,搜索栏和底部栏(对应于您在应用程序中描述的其他视图)。它也有属性tableViewControllerdetailViewController。在其viewDidLoad实现中,它将TableViewController实例添加为子视图控制器。当轻击表格视图时,视图控制器会将一个DetailViewController实例添加为子视图控制器并转换为它。轻击细节视图上的按钮将转换回表格视图,并将细节视图控制器作为子项移除。

这里是我的viewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableViewController = [[TableViewController alloc] init]; 
    self.tableViewController.delegate = self; // I implement a protocol TableViewControllerDelegate to know when row is tapped 

    // Fix for origin being 20 by default. 
    CGRect frame = self.tableViewController.view.frame; 
    frame.origin.y = 0.0f; 
    self.tableViewController.view.frame = frame; 

    [self addChildViewController:self.tableViewController]; 
    [self.containerView addSubview:self.tableViewController.view]; 
    [self.tableViewController didMoveToParentViewController:self]; 
} 

我有一个委托方法使容器知道当一个表行被窃听,并执行表视图和详细视图之间的过渡。其实现如下:

- (void)tableViewController:(TableViewController *)tvc didSelectIndex:(NSInteger)index 
{ 
    self.detailViewController = [[DetailViewController alloc] init]; 
    self.detailViewController.backButtonBlock = [self backButtonBlock]; // This block handles the transiton from detail back to table 
    CGRect detailStartingFrame = self.detailViewController.view.frame; 
    detailStartingFrame.origin.x = self.containerView.frame.size.width; 
    self.detailViewController.view.frame = detailStartingFrame; 

    [self addChildViewController:self.detailViewController]; 
    [self transitionFromViewController:self.tableViewController 
         toViewController:self.detailViewController 
           duration:0.5 
           options:0 
          animations:^{ 
           CGRect newTableFrame = self.tableViewController.view.frame; 
           newTableFrame.origin.x = (-1.0f * newTableFrame.size.width); 
           self.tableViewController.view.frame = newTableFrame; 

           [self.containerView addSubview:self.detailViewController.view]; 
           CGRect newDetailFrame = self.detailViewController.view.frame; 
           newDetailFrame.origin.x = 0.0f; 
           self.detailViewController.view.frame = newDetailFrame; 
          } completion:^(BOOL finished) { 
           [self.detailViewController didMoveToParentViewController:self]; 
          }]; 
} 

如上所述,详细视图在点击后退按钮时执行块。我在这里ViewController创建此块:

- (GoBackButtonBlock)backButtonBlock 
{ 
    GoBackButtonBlock block =^{ 
     [self.detailViewController willMoveToParentViewController:nil]; 

     [self transitionFromViewController:self.detailViewController toViewController:self.tableViewController duration:0.5 options:0 animations:^{ 
      CGRect newDetailFrame = self.detailViewController.view.frame; 
      newDetailFrame.origin.x = self.containerView.frame.size.width; 
      self.detailViewController.view.frame = newDetailFrame; 

      CGRect newTableFrame = self.tableViewController.view.frame; 
      newTableFrame.origin.x = 0.0f; 
      self.tableViewController.view.frame = newTableFrame; 
     } completion:^(BOOL finished) { 
      [self.detailViewController removeFromParentViewController]; 
      [self.detailViewController.view removeFromSuperview]; 
     }]; 
    }; 

    return [block copy]; 
} 

这是对所有有它。请务必阅读UIViewController class reference的“实施容器视图控制器”部分以了解更多详细信息。希望这可以帮助!

+0

你好卡尔,首先我很抱歉,我没有回应。我很抱歉。你真的在努力工作,并花了一些时间。我为延误表示歉意。我生病了。我想我理解你的观点,并且从今天开始走这条路。谢谢。我会及时向大家发布。 – Sallu

+0

@Sallu哦哇没问题,高兴你感觉好多了!如果您有任何疑问,请告诉我,或者我可以澄清一些事情。 –

0

在视图中准备所有细节,然后将此视图添加到当前屏幕。就是这样。

+0

但视图是全尺寸的(除非我不知道),它也取代了顶部的酒吧和底部酒吧。因此,在新的观点,我将不得不再次绘制顶部酒吧,底部酒吧(只是一个重复的工作 - 这是不好的工作方式) – Sallu

1

在您的“tableViewDidSelectRowAtIndex”方法中,在选择行时,只显示特定的自定义视图(其中包含选定行的详细信息),并且同时隐藏表视图,因此您可以获得您想要的视图。然后在该自定义视图上创建一个后退按钮,并在该按钮操作上隐藏当前视图并再次显示该表视图。

+0

谢谢维内特。你的诀窍简单而有效。肯定会帮助其他人登陆此页面。 – Sallu

相关问题