1

さて、これが状況です。私は現在MainViewController、多くの異なるセルを持つUITableViewを持つというViewControllerを持っています。セルをクリックすると、そのセルが拡大(高さが増す)して、「追加情報」が表示されるようにします。問題は、この追加情報が非常に複雑であり、UILabels、他のUITableViews、UIWebViews、およびUIImageViewsが含まれている可能性があることです。さらに、この「追加データ」は、正確に何を表示するか(つまり、UILabelsの内容、UIImageViewsの大きさ)を決定するために、かなりの計算を必要とします。したがって、この「追加情報」の複雑さのために、私は自分のプログラムをどのように設計するかについて途方に暮れています。

「追加情報」には多くのコードが必要なので、そのコードを単にスローしたくはありません。MainViewController.さらに、Interface Builderを使用して、これらの「追加情報」ビューをグラフィカルに設計する方法があれば便利です。プログラム的に。

現在、私は追加情報の各セットを独自の個別のUIViewControllerとして持っており(したがって、データに対して個別のクラスを持ち、Interface Builderを使用できるようになります)、セルが選択されると新しい画面に移動します。しかし、私は新しい画面にセグエしたくありません。このUIViewコントローラーが表示しているすべてのデータをに表示したいと思いますMainViewController。これを行うための最良の方法は何ですか?

要約すると、私は現在、あるUIViewControllerを別のUIViewControllerにセグエしています。ただし、2番目のUIViewControllerのコンテンツを最初のコンテンツに表示したいと思います。可能であれば、ある種のInterface Builderを使用して、この2番目のUIViewControllerのロジックを別のクラスに分離したいと思います。

詳細:〜私はiOS 5専用に開発しており、ARCを使用しています。〜iOS 4以下向けに開発したことはなく、nibファイルを使用したこともありませんが、必要に応じて学習したいと思います。簡単なサンプルコードが役立ちます。〜ありがとう!

4

4 に答える 4

2

SmartWorkと同じ意見。

UITableViewCellをメインのxibビューとして、xibファイルを使用してカスタムUITableViewCellクラスを作成する必要があります

また、tableViewデータソースでは、次のようにインポートできます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyViewCell";
    MyViewCell *cell = (MyViewCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyViewCell" owner:nil options:nil];
        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (MyViewCell *)currentObject;
                break;
            }
        }
    }
    [self configureCell:cell atIndexPath:indexPath]; // your own function to customize your cell.
    return cell;
}

次に、セルxibで、セルの最大の高さを設定し、UITableViewDelegateクラスで有効な高さを決定できます。

于 2012-06-27T13:23:59.787 に答える
2

ここにいくつかの良い提案がありますが、それloadNibNamed:owner:は毎回ファイルシステムからnibを読み取るため、繰り返し呼び出すにはかなり高価なAPIであることに注意してください。代わりに、このようなことを検討してください。

nibファイルをに登録しますviewDidLoad。Interface Builderで、カスタムセルの再利用識別子を必ず指定してください。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UINib *myNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.tableView registerNib:myNib forCellReuseIdentifier:@"MyCell"];

    // Do any other stuff you need to do...
}

次に、必要なときにいつでもカスタムセルをデキューします。UINib毎回ファイルシステムから再ロードされないように、nibファイルをメモリにキャッシュします。

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

    // Configure cell as needed...

    return cell;
}
于 2012-06-28T00:48:18.510 に答える
1

私の意見では、あるUiviewControllerを別のUiviewController内で使用する必要はありません。

uはnibファイルでUiviewを使用できるため、これらの「追加情報」ビューをグラフィカルに設計できます。実装と保守が非常に簡単です。

于 2012-06-27T13:04:21.353 に答える
1

SmartWorkの説明に加えて、特定のセルをタップすると、次のコード行を使用してその行の高さを更新できます。

- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     // set a dynamic value for the cell height depending on the state of the data in the cell 
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    // update the state of the data in the cells here..  
    // calling these below lines will change the height of the cells smoothly 


    [tableView beginUpdates]; 
    [tableView endUpdates]; 

}

カスタムUITableViewCellsも必要になります。それらを単純なビューと見なし、必要なサブビューをいくつでも追加および削除します

セル内のサブビューにペン先を使用することに熱心な場合は、次のようにペン先を作成してカスタムTableViewセルに接続できます(サブビューはtableViewCellのプロパティにすることができます)。

NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCellNib" owner:self options:nil];

mySubview = [(SubView *)[nib objectAtIndex:0]retain];
于 2012-06-27T13:37:50.527 に答える