1

我在 xCode 4.3 中编码这是我的第一个应用程序。

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

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

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

但这只会增加我的工作量,因为我将不得不在我的所有视图中重做顶部栏和底部栏(在整个应用程序中保持相同)。有没有办法将我的主 UIViewController 的元素更改为 UITableView。

感谢你在期待。

4

3 回答 3

1

在您的“tableViewDidSelectRowAtIndex”方法中,在选择行时,只显示特定的自定义视图(包含所选行的详细信息),同时隐藏表格视图,这样您就可以拥有您想要的视图。并在该自定义视图上创建一个后退按钮,并在该按钮操作上,隐藏您当前的视图并再次显示 tableview。

于 2012-08-25T05:44:57.970 回答
0

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

于 2012-08-25T02:45:12.860 回答
0

我假设您可以在这里使用 iOS 5 的功能。您可以做的是实现一个容器视图控制器 - 很像 UINavigationController,但具有您自己的视图布局,因此您可以将徽标、搜索栏等全部保留在适当的位置,并且仅在视图的一部分中的视图之间进行转换。

我创建了一个名为ViewController. 它有一个containerView在 .xib 文件中设置的 UIView 出口,以及一个顶部栏、搜索栏和底部栏(对应于您在应用程序中描述的其他视图)。它还具有属性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 类参考的“实现容器视图控制器”部分以获取更多详细信息。希望这可以帮助!

于 2012-08-29T05:55:41.537 回答