ios - 不同类中的委托(delegate)和数据源可能吗? - UITableView

标签 ios objective-c swift uitableview delegates

当使用 UITableView 时,有两种类型的方法,即,数据源和委托(delegate)仍然应该连接到相同的父 View Controller 类

有什么方法可以在不同的类中定义委托(delegate)和数据源吗?

为什么我们需要将委托(delegate)和数据源分开?

注意:这个问题适用于 UICollectionView 和类似的对象

最佳答案

正如其他响应中关于委托(delegate)模式的充分解释,我们可以将 tableview 数据源和委托(delegate)声明为不同的对象,以避免 Massive ViewControllers 并实现精益 ViewControllers。

这是一个使用委托(delegate)设计模式的代码示例。

import UIKit

// MARK: Cell

class ItemCell: UITableViewCell{
    var label: UILabel!
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 20))
        label.textColor = .black
        label.backgroundColor = .yellow
        contentView.addSubview(label)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

// MARK: Main View Controller

class BlueViewController: UIViewController{

    var tableView: UITableView!
    var myDataSourse: MyTVDataSource!
    var myDelegate: MyTVDelegate!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .blue
        tableView = UITableView()
        myDataSourse = MyTVDataSource(tableView: tableView)
        myDelegate = MyTVDelegate()
        myDelegate.presentingController = self
        tableView.dataSource = myDataSourse
        tableView.delegate = myDelegate
        tableView.register(ItemCell.self, forCellReuseIdentifier: "Cell")

        self.view.addSubview(tableView)



        self.tableView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0)
            ])
    }
}
extension BlueViewController: BluePresenting{
    func currentSelected(_ indexPath: IndexPath) {
        print(indexPath)
    }


}

// MARK: TableViewDelegate


protocol BluePresenting: class {
    func currentSelected(_ indexPath: IndexPath)
}

class MyTVDelegate: NSObject,UITableViewDelegate{

   var presentingController: BluePresenting?

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            presentingController?.currentSelected(indexPath)
    }
}

// MARK: TableView DataSource


class MyTVDataSource: NSObject, UITableViewDataSource{
    private var tableView: UITableView
    private var items = ["Item 1","item 2","item 3","Item 4"]

    init(tableView: UITableView) {
        self.tableView = tableView
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count

    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = ItemCell(style: .default, reuseIdentifier: "Cell")
        cell.label.text = items[indexPath.row]

        return cell
    }

}

关于ios - 不同类中的委托(delegate)和数据源可能吗? - UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523505/

相关文章:

ios - 如何在范围内暂停信标的通知?

ios - 如何在 iOS 中使用 flutter_blue?

ios - UIView 中的动态 UILabel 增加内存

ios - 透明UI工具栏

swift - 使用未声明的类型 'GraphQLMappable' Apollo-iOS

ios - 如何在日历中获取上个月和下个月-Swift

ios - 从 UIImage 获取 CurrentBackgroundImage 路径

ios - 如何从 AudioQueueBufferRef 获取 CMSampleBufferRef

ios - IOS中的paypal sdk Touch id认证

ios - UICollectionView 垂直全屏和水平 2 个屏幕