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」メソッドでは、行の選択時に、特定のカスタムビュー(選択した行の詳細を含む)を表示すると同時に、テーブルビューを非表示にするので、必要なビューを表示できます。そのカスタムビューに戻るボタンを作成し、そのボタンアクションで現在のビューを非表示にして、テーブルビューを再度表示します。

于 2012-08-25T05:44:57.970 に答える
0

ここでは、iOS 5 の機能を使用できることを前提としています。あなたができることは、コンテナー ビュー コントローラーを実装することです。UINavigationController によく似ていますが、独自のビュー レイアウトを使用して、ロゴ、検索バーなどをすべて所定の位置に保持し、ビューの一部のビュー間でのみ遷移することができます。

という名前の新しいコンテナ ビュー コントローラを作成しましたViewControllercontainerView.xib ファイルに設定された UIView アウトレットと、トップ バー、検索バー、およびボトム バー (アプリケーションで記述した他のビューに対応) があります。プロパティtableViewControllerともありますdetailViewController。その実装では、インスタンスを子ビュー コントローラーとしてviewDidLoad追加します。TableViewControllerテーブル ビューがタップされると、View Controller はDetailViewControllerインスタンスを子 View Controller として追加し、それに遷移します。詳細ビューのボタンをタップすると、テーブル ビューに戻り、詳細ビュー コントローラーが子として削除されます。

これが私の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 に答える
0

ビューですべての詳細を準備してから、このビューを現在の画面に追加します。それはそれです。

于 2012-08-25T02:45:12.860 に答える