Swift中的子类UITableView

时间:2015-06-12 00:04:07

标签: ios swift

我正在尝试在Swift中创建UITableView的子类。

var tableScroll = HorizontalScrollTableView(frame: CGRectMake(15, 15, cell.contentView.frame.width - 30, cell.contentView.frame.height - 30))
cell.contentView.addSubview(tableScroll)

我按以下方式添加表格,然后我有一个带有

的Horizo​​ntalScrollTableView swift文件
import UIKit

class HorizontalScrollTableView : UITableView {

func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 1
}
...

然而,Table表示为普通默认表,而Horizo​​ntalScrollTableView中的函数不会覆盖默认表。

2 个答案:

答案 0 :(得分:1)

您可能希望覆盖numberOfSections而不是numberOfSectionsInTableView:,这是UITableViewDataSource协议上的方法。但是,我认为创建自己的UITableViewController子类或符合UITableViewDataSource的类并将其设置为表视图的委托而不是表视图本身更为明智。子类化UIView及其后代通常保留用于自定义视图特定的功能和属性,例如添加自定义绘图或自定义触摸处理。

答案 1 :(得分:0)

我继续使用Playground做了一个简单的例子。您可以看到表视图不是子类,而是有一个视图控制器,它用作表视图的委托和表视图的替代数据源。

数据源提供表视图的行数据,委托(也是视图控制器)提供单元格。

这是我通常如何设置表视图的框架,尽管我通常会使用XIB。

import UIKit

// data for table view is array of String
let rowData = [ "Chicago", "Milwaukee", "Detroit", "Lansing" ]

//
// simple subclass of UITableViewCell that has an associated ReuseIdentifier
// and a value property. Setting the value property changes what the cell displays
//

public class TableViewCell : UITableViewCell
{
    public static let ReuseIdentifier = "TableViewCell"

    var value:AnyObject? {
        didSet {
            self.textLabel!.text = value as? String
        }
    }
}

//
// Simple implementation of a table view data source--just contains one String per row
// You could change your rowData to be an array of Dictionary for richer content possibilities.
// You could also load your data from a JSON file... for example
//

class TableViewDataSource : NSObject, UITableViewDataSource
{
    var rowData:[String]?

    init( rowData:[String] )
    {
        self.rowData = rowData
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return rowData?.count ?? 0
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        assert( indexPath.section ==  0 ) // we only have 1 section, so if someone section ≠ 0, it's a bug

        var cell:TableViewCell! = tableView.dequeueReusableCellWithIdentifier( "Cell" ) as? TableViewCell
        if cell == nil
        {
            cell = TableViewCell( style: .Default, reuseIdentifier: "Cell" )
        }

        cell.value = self.rowData![ indexPath.row ]

        return cell
    }

}

// This is the view controller for our table view.
// The view controller's view happens to be a table view, but your table view
// could actually be a subview of your view controller's view

class TableViewController : UIViewController, UITableViewDelegate
{
    // data source for our table view, lazily created
    lazy var tableViewDataSource:TableViewDataSource = TableViewDataSource( rowData: rowData )

    override func loadView()
    {
        // our view is a UITableView
        let tableView = UITableView()
        tableView.delegate = self
        tableView.dataSource = self.tableViewDataSource // using a self-contained data source object for this example
        self.view = tableView
    }
}

let window:UIWindow! = UIWindow()
window.rootViewController = TableViewController()
window.makeKeyAndVisible()  // click the "preview eyeball" to see the window