将动画构建到UITableView

时间:2016-11-24 11:42:30

标签: ios uitableview uikit

我创建了一个我非常喜欢的表视图 - 它在委托函数tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)中播放了一些不错的动画。

问题是,我找不到在我的代码库中的其他地方复制该行为的方法,而无需复制并粘贴委托函数中的代码并违反DRY。我希望能够从一个地方调整项目中所有tableviews的动画参数。

  1. 首先,我尝试编写UITableView的子类,但这并不好,因为动画是在委托函数中指定的。您可以使子类成为自己的委托并定义所需的行为,但其包含的其他任何委托函数都不可用于其包含的视图。

  2. 我考虑过编写一个继承自UITableViewDelegate的协议,但是你必须重新实现协议中的每个tableview委托函数,即使其中只有一个是不同的。

  3. 我想过尝试调整willDisplayCell函数,但我不确定它是否会起作用,如果我远离它,我真的不想乱七八糟。

  4. 我怎么能把这样的东西拉下来?在这个非常具体的情况下,以及更普遍的OOP意义上,想要为委托函数提供默认行为而不必将类设置为自己的委托?

    编辑:这不是你可以真实拍照的东西,但仍然是截图请求。 enter image description here

2 个答案:

答案 0 :(得分:2)

你不应该是UITableView的子类,也不应该是swizzle,也不应该扩展委托协议。

我要做的是编写一个实现和包装委托方法的类。这个类可以拥有它自己的委托,但我宁愿给它闭包来调用。

public void onResume() {
    LOG.i("+++++++ OnResume is Called");
    super.onResume();
    ConnectivityManager connectivityManager = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    LOG.i("++++++ Active Network Connected :: " + activeNetInfo.isConnected());
}

一个完整的例子:

class TableViewDelegate: UITableViewDeleagte {
    var willDisplayCell: ((UITableView, UITableViewCell, IndexPath) -> Void)?
    let animator: Animator
    weak var tableView: UITableView? {
        didSet {
            tableView?.delegate = self
        }
    }
    init(tableView: UITableView, animator: Animator) {
        self.animator = animator
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UItableViewCell, forRowAt indexPath: IndexPath ) {
        animator.animate(cell)
        willDisplayCell?(tableView, cell, indexPath)
    }
}

答案 1 :(得分:1)

创建UIViewController子类所有动画tableViews继承自:

class BaseAnimatedTableViewController: UIViewController, UICollectionViewDelegate  {
    var tableView: UITableView!  

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView = UITableView
        //setupTableView
        tableView.delegatge = self
    }  
    //override delegate methods, that all subclasses should share
}

并为每个动画tableView子类化它:

class AnimatedTableView1: BaseAnimatedTableViewController, UITableViewDataSource {
       ...
}

class AnimatedTableView2: BaseAnimatedTableViewController, UITableViewDataSource {
       ...
}

您当然也可以继承UITableViewController而不是UIViewController