0

Storyboard を使用して UICollectionViewController - CollectionView - セル (自分の DasboardsViewCell) とセル内の顧客ビュー (DashBoardView) を作成しています。すべてを正しく配線したところ、上下にスクロールする場合を除いてすべてが機能しているようです。デバッグした後、私の理解が何であるかを説明します。

また、DashBoardView カスタム ビュー内に 2 つのビューがあり、「1 つ」をメイン プライマリとして使用し、もう 1 つを FlipView として使用しました (たとえば、ユーザーがセルをタップしたとき)。すべてがストーリーボードから配線されているため、再利用のためにクラスを登録する必要はありません。

1)私のDashboardCustomView(上記のように2つの他のビューがある)でこれを行います

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        _isPrimary = YES;
         //to init my 2 child views and insert to main custom view
        [self initSubViewsWithInsert]; 
}
return self;

}

2) 私の DashBoardViewCell クラスでは、これを行います

@synthesize dashBoardView = _dashBoardView;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0.75f alpha:0.6f];
        self.layer.borderColor = [UIColor blackColor].CGColor;
        self.layer.borderWidth = 2.0f;
        self.layer.cornerRadius = 7.0f;
    }
return self;
}

// If I dont do this below I get overlapped images and data on cell when scrolling up and down
- (void)prepareForReuse
{
    self.dashBoardView.mainContainerView = nil;
    self.dashBoardView.flipView = nil;
}

3) この後も、カスタム ビューが順不同で表示され、ビューで "nil" を実行しないよりはいくらか良いように見えますが、問題は、2 つのサブビューを nil アウトすると、それらを再初期化する方法が定義されていないことです。 collectionview controller はセルを再キューイングし、コンテンツの追加を開始します。

つまり、私はこの cellForItemAtIndexPath が好きです

if ([cell isKindOfClass:[DashboardsViewCell class]]) {
    DashboardsViewCell *dashCell = (DashboardsViewCell*) cell;
    Dashboard* tmpDashboard = self.availableDashBoards[indexPath.item];
    [dashCell.dashBoardView addDashboardImageViewAtPoint:tmpDashboard.identifier
                                          usingIndexPath:indexPath];

上記の最後の行は、ダッシュボードのメイン ビューである self.dashBoardView.mainContainerView に画像とテキストを追加していますが、既に nil になっています。

これを行うための定義された方法があるかどうかを誰かが理解するのを手伝ってくれますか? また、私が間違った問題を見ていると思われる場合

4

2 に答える 2

0

問題が正確に何であるかはわかりません。そのコードでは、わかりにくいです。プロジェクトをどこかに投稿できれば、より簡単になります。多くのことがストーリーボード化されたので、コードを投稿するだけで問題を修正するのは難しくなります:(

でも、ひょっとして自動レイアウトを使っていませんか?

于 2013-04-27T17:27:43.710 に答える
0

返信ありがとうございます - いいえ、私は自動レイアウトを使用していません。コードが大きくなりすぎたため、ここにコードを投稿できませんが、問題を解決するために私がしたことは次のとおりです。

1) セルが更新されている (デキュー) ときに、ロジックは、特定のセル (ユーザーが A、B、C、D などからダッシュボード B をタップ) の状態を実際に維持し、同じセルを考えている自分の内部状態であることに気付きました。同じ indexPath に適用されます。すなわち

a) ユーザーがセル 2 をタップした場合 - セカンダリ ビューに切り替え、セルでその状態を維持します。

b)ユーザーが上下にスクロールすると、セルが更新され、prepareForResuse で内部ビューを解放します

何が間違っていたのかがわかったら、アプローチを変更してコントローラーのロジックを移動する必要があります。

ここでは曖昧に聞こえるかもしれませんが、セル cellForItemAtIndexPath とそれが何をすべきかについての私の仮定が間違っていることがわかりました。それを理解したら、デザインを修正することができました。

于 2013-04-30T02:00:12.760 に答える