0

SDNestedTable と呼ばれる CocoaControls で見つけたコントロールを使用したい: https://github.com/serverdensity/ios-SDNestedTable

クラスをサブクラス化しましたSDNestedTableViewControllerが、表のセルの背景色を変更したいのですが、それを行う方法が提供されていません。

ライブラリ内の他のクラスはSDGroupCellSDSubCellから継承されSDSelectableCellます。SDSelectableCellセルの状態に応じて背景を変更する 3 つのメソッドが含まれています。

の関連するメソッドは次のSDSelectableCell.mとおりです。

- (void) styleEnabled
{
    for (UIView *view in checkBox.subviews) [view removeFromSuperview];
    [checkBox addSubview:onCheckBox];
    checkBox.alpha = 1.0;
    itemText.alpha = 1.0;
    self.backgroundView.backgroundColor = UIColorFromRGBWithAlpha(0x0d2e4d, 1.0);
}

- (void) styleDisabled
{
    for (UIView *view in checkBox.subviews) [view removeFromSuperview];
    [checkBox addSubview:offCheckBox];
    checkBox.alpha = 1.0;
    itemText.alpha = 0.4;
    self.backgroundView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:1.0];
}

- (void) styleHalfEnabled
{
    for (UIView *view in checkBox.subviews) [view removeFromSuperview];
    [checkBox addSubview:onCheckBox];
    checkBox.alpha = 0.45;
    itemText.alpha = 0.7;
    self.backgroundView.backgroundColor = UIColorFromRGBWithAlpha(  , 1.0);
}

これを行うには2つの方法がありますが、私は初心者であり、これを処理する最良の方法を確認したいと考えています:

1) SDSelectableCell.m のコードを変更するだけです。3 つの色を設定するには 3 行を変更する必要があり、それで完了です。ただし、このようなライブラリをインポートしてコードを変更するだけでは、悪い習慣だと思います。プロジェクトに取り組んでいる誰かがライブラリを再インポートする必要があり、それが変更されたことを知らない場合、将来問題が発生することを予見できます。

1a) すべての名前を変更/リファクタリングして、SD にならないようにすることもできると思います。これにより、少なくとも他の誰かが元の SDNestedTable ライブラリであると考えるのを防ぐことができます。

2) これら 3 つのメソッドをサブクラス化SDSelectableCellしてオーバーライドできます。ただし、ライブラリ内の他のすべてのクラスをサブクラス化する必要があります。これらは SDSelectable セルをインスタンス化し、それをすべて変更する必要があるためです。

3) 他の方法は?カテゴリと拡張機能は機能していないようですが、何かが足りないのかもしれません。

4

1 に答える 1

0

githubコードをざっと見てみると、セルを好きなようにセットアップするための簡単な方法を提供しているように見えます。SDNestedTableDelegateメソッドを実装します-mainTable:itemDidChange:

- (void)mainTable:(UITableView *)mainTable itemDidChange:(SDGroupCell *)item
{
    SelectableCellState state = item.selectableCellState;
    switch (state) {
        case Checked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        case Unchecked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        case Halfchecked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        default:
            break;
    }
}

アップデート

SDNestedTableViewControllerとをオーバーライド-mainTable:setItem:forRowAtIndexPath:してサブクラス化するときに、ライブラリがアイテムとサブアイテムをフォーマットする場所を提供しているように見えます-item:setSubItem:forRowAtIndexPath:。それを上記の項目と組み合わせるとコードが変更され、共通の機能を抽出すると次のようになります。

- (void)PRIVATE_finalizeSelectableCell:(SDSelectableCell *)item
{
    SelectableCellState state = item.selectableCellState;
    switch (state) {
        case Checked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        case Unchecked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        case Halfchecked:
            item.backgroundView.backgroundColor = [UIColor ...];
            break;
        default:
            break;
    }
}
- (void)mainTable:(UITableView *)mainTable itemDidChange:(SDGroupCell *)item
{
    [self PRIVATE_finalizeSelectableCell:item];
}
- (SDGroupCell *)mainTable:(UITableView *)mainTable setItem:(SDGroupCell *)item forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [self PRIVATE_finalizeSelectableCell:item];
    return item;
}
- (SDSubCell *)item:(SDGroupCell *)item setSubItem:(SDSubCell *)subItem forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self PRIVATE_finalizeSelectableCell:subItem];
    return subItem;
}
于 2013-02-12T02:17:57.763 に答える