-4

理解を深めるために、質問をすべての詳細で完全に再更新します。

写真は言葉よりも多くを語ると言われているように、すべてを詳細に説明するために小さなモックアップを作りました!

まずは文章で説明します。

私はこれを持っています:

  • 1 MasterViewController = (RootViewController)
  • 1 FirstView = UITableView (データを含む多数のカスタム セルが表示されます)
  • 2 SecondView = UIView
  • 3 ThirdView = UIView

現在の画像/モックアップ:

私の問題のための私のモックアップ

私のMasterViewController.h(コードの一部)

@property (strong, nonatomic) FirstView *firstView;
@property (strong, nonatomic) SecondView *secondView;
@property (strong, nonatomic) ThirdView *thirdView;

私のMasterViewController.m(コードの一部)

        firstView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        firstView.backgroundColor = [UIColor clearColor];
        firstView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:firstView];
        [firstView setHidden:NO];

        secondView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        secondView.backgroundColor = [UIColor clearColor];
        secondView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:secondView];
        [secondView setHidden:NO];


        thirdView = [[LastSalesView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
        thirdView.backgroundColor = [UIColor clearColor];
        thirdView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [bottomContainerView addSubview:thirdView];
        [thirdView setHidden:NO];



-(void)viewFirstPage:(id)sender {
    NSLog(@"button first pushed");
    [firstView setHidden:NO];
    [secondView setHidden:YES];
    [thirdView setHidden:YES];
}

-(void)viewSecondPage:(id)sender {
    NSLog(@"button second pushed");
    [firstView setHidden:YES];
    [secondView setHidden:NO];
    [thirdView setHidden:YES];
}

-(void)viewThirdPage:(id)sender {
    NSLog(@"button third pushed");
    [firstView setHidden:YES];
    [secondView setHidden:YES];
    [thirdView setHidden:NO];
}
4

3 に答える 3

1

免責事項この回答は、OP が投稿を更新する前に与えられたもので、元の質問はほとんど「テーブル ビューを使用するにはどうすればよいですか?」でしたが、今ではまったく異なるものに変わりました。私の答えはまだ誰かにとって価値があるかもしれません.

テーブルビューの使用方法を簡単に説明しましょう。ここには 3 つの主要なコンポーネントがあります。

  1. UITableViewは MVC パターンのビューであり、その唯一の仕事はデータを表示することであり、コンテンツ オフセットに相対的に表示することです。これは、画面から出たときにエンキューするセルの量を設定することによって行われます。表示する必要があるときにそれらをデキューします。注意を払うと、 はUITableViewから継承しUIScrollViewているため、最小量のセルを使用できるようにする再利用可能なセル システムを使用してスクロール メカニズムを拡張するだけです。
  2. UITableViewCellアプリ内の単一のデータを表す責任があります。これは、MVC パターンのビューの一部でもあります。
  3. ここで、UITableViewどこかからデータを取得する必要があります。次の 2 つの可能性があります。
    1. サブクラス a UITableViewController
    2. に準拠して、別のクラスにデータを入力してもらいUITableViewDataSourceます。

どちらを選択しても、データを入力するクラスが MVC パターンのコントローラーになります (モデルは完全にあなた次第です。テーブル ビューが気にする限り、文字列の単純な配列にすることができます)。

UITableView、自分のためにセルが埋められる (または作成される) ことを期待しています。重要な違いは次のとおりです。

  • iOS 4.x 以前では、MVC パターンに反するため、独自のセル作成を作成する必要がありました。
  • iOS 5 ではregisterNib:forCellReuseIdentifier:およびregisterClass:forCellReuseIdentifier:メソッドが導入され、独自のセル作成を作成する必要がなくなりました。追加のセルが必要かどうかが自動的にチェックされ、必要に応じてインスタンス化されます。

つまり、表示するデータのみを変更する必要がある場合は、テーブル ビューをサブクラス化する必要はありません。

あなたの質問に答えるには...

ペン先の使用

誰がデリゲートになるべきかは完全にあなた次第です。テーブルビュー内のデータを制御する別のオブジェクトを持つことさえできます。

しかし今のところ、それを で実行してみましょうMasterViewController。あなたのMasterViewControllerxib ファイルには、サブクラス化なしの通常の UITableView があります。MasterViewControllerに準拠していることを確認してから<UITableViewDataSource>、テーブルビューdataSourceアウトレットをMasterViewController(おそらくファイル所有者のもの)に接続します。

重要なメソッドは と の 2 つだけで、それらを実装する-tableView:cellForRowAtIndexPath:-tableView:numberOfRowsInSection:、tableView が機能します。

高さ、編集、その他すべてのような他のことは、UITableViewDelegateプロトコルの一部です。それらを気にする場合は、上記の手順をdelegateアウトレットに対して繰り返します。

コード別

なぜ人々がニブをそんなに嫌うのかわかりませんが.. とにかく、で実行しましょうMasterViewController

MasterViewController.m

#include "MasterViewController.h"
#include "MyCell.h"

@interface MasterViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic,weak) UITableView *tableView;
@end

@implementation MasterViewController

- (void)viewDidLoad
{
    // Notice that this method only gets called if you're using a nib
    // If you plan of getting rid of nibs ENTIRELY, use -loadView
    [super viewDidLoad];

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    tableView.dataSource = self;
    tableView.delegate   = self;
    [self.view addSubview:tableView];

    // Save a reference to it
    self.tableView = tableView;

    // iOS 5+
    [tableView registerClass:[MyCell class] forCellReuseIdentifier:@"cell.something"];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Again, iOS 5+
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell.something" forIndexPath:indexPath];

    cell.textLabel.text = @"Hello world!";        

    return cell;
}

@end

複雑なビューのヒント

MasterViewControllerまた、テーブル ビューのデータに関連するコードを に処理させたくないという印象を受けました。デリゲートなので、好きなところに向けることができます! 上記のプロトコルに準拠する をドロップするNSObjectと、次のように簡単に実行できます。

ホット IBOutlet アクション

非常に複雑なビューを扱っていて、余分なtableView:didFart:andSmelledNice:コードが邪魔になる場合に非常に便利です。あなたは明らかにコードでそれを行いますが、私はそれを言いません.ペン先の道から離れたことに対するあなたの罰だと考えてください.

于 2013-07-27T04:16:49.990 に答える
1

UITableViewDataSourceあなたが求めているメソッドは、通常、View Controller に属しています。実際、MasterViewControllerクラスはすでに UITableViewDataSourceプロトコルを実装することを宣言しています。

@interface MasterViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

そのため、 でテーブル ビューを作成する場合MasterViewController、View Controller はそれがデータ ソース (およびデリゲート) であることをテーブル ビューに伝える必要があります。

myTableView = [[MyTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, result.width, result.height)];
myTableView.dataSource = self;
myTableView.delegate = self;

これで正しい道に進むはずです。

于 2013-07-27T03:33:03.477 に答える
0

View UITableView の場合、次のように使用できます---

MyFirstView.h

#import <UIKit/UIKit.h>

@class UIViewController;

@interface MyFirstView : UITableView<UITableViewDelegate,UITableViewDataSource>

@end

MyFirstView.m

#import "MyFirstView.h"

@implementation MyFirstView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate=self;
        self.dataSource=self;
        // Initialization code
    }
    return self;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *mycell=[tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

    if (mycell==nil) {
        mycell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentifier"];
    }

    mycell.textLabel.text=@"My super view is tableView.";
    return mycell;
}

@end

これらの UITableView ファイルを次のように使用します。

MyFirstView *tblView=[[MyFirstView alloc] init];
[tblView setFrame:CGRectMake(0, 0, 320, 300)];

[self.view addSubview:tblView];

それでもわからない場合はこれを読んでください

于 2013-07-27T05:36:40.660 に答える