基本 - 如何更改导入的库

时间:2013-02-12 01:34:32

标签: ios objective-c subclass

我想使用我在CocoaControls上找到的名为SDNestedTable的控件:https://github.com/serverdensity/ios-SDNestedTable

我已经将SDNestedTableViewController类子类化,但我想更改表格单元格的背景颜色,并且没有提供的方法。

库中的其他类是SDGroupCellSDSubCell,它们继承自SDSelectableCellSDSelectableCell包含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);
}

我可以看到两种方法,但我是一个新手,想要验证处理这个问题的最佳方法:

1)只需更改SDSelectableCell.m中的代码即可。我必须改变3行来设置3种颜色,然后我就完成了。但是,我认为导入像这样的库只是更改代码是不好的做法。如果从事该项目的人必须重新进口该库并且不知道它已被更改,我可以预见将来的问题。

1a)我想我也可以重命名/重构一切,这样它就不再是SD了,这至少会阻止其他人认为它是原始的SDNestedTable库。

2)我可以继承SDSelectableCell并覆盖这3个方法。虽然,这需要我继承库中的每个其他类,因为它们实例化SDSelectable单元格,我必须改变所有这些。

3)其他一些方式?类别和扩展似乎不起作用,但也许我错过了一些东西。

1 个答案:

答案 0 :(得分: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;
}