分离ViewController和UITableViewDataSource

时间:2015-08-07 13:42:29

标签: ios swift uitableview xcode6 swift2

我试图通过将UITableViewDataSource(和Delegate)移动到一个单独的类来清理我拥挤的ViewController。

虽然DataSource在ViewController中(见下文),但它运行良好

class ViewController: UIViewController, UITableViewDataSource{

//MARK: Properties
@IBOutlet weak var myTableView: UITableView!
let cellIdentifier = "myTableViewCell"
let myArray = ["Label one", "Label two", "Label three"]


override func viewDidLoad()
{
    super.viewDidLoad()

    myTableView.dataSource = self
}

override func didReceiveMemoryWarning()
    {super.didReceiveMemoryWarning()}


//MARK: TableViewDataSource
func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {return 1}

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! myTableViewCell

    cell.myLabel.text = myArray[indexPath.row]

    return cell
}
}

使用myTableViewCell类

class myTableViewCell: UITableViewCell{

@IBOutlet weak var myLabel: UILabel!

override func awakeFromNib()
    {super.awakeFromNib()}

override func setSelected(selected: Bool, animated: Bool)
    {super.setSelected(selected, animated: animated)}
}

这样可以正常工作,并使用myArray中字符串填充的标签填充基本表。

然而,当我将DataSource移动到它自己的类时,如下所示,它不起作用

的ViewController

class ViewController: UIViewController
{
//MARK: Properties
@IBOutlet weak var myTableView: UITableView!


override func viewDidLoad()
{
    super.viewDidLoad()

    myTableView.dataSource = myDataSource()
}

override func didReceiveMemoryWarning()
{super.didReceiveMemoryWarning()}

}

这里是myDataSource类

class myDataSource: NSObject, UITableViewDataSource
{
let cellIdentifier = "myTableViewCell"
let myArray = ["Label one", "Label two", "Label three"]

//MARK: TableViewDataSource
func numberOfSectionsInTableView(tableView: UITableView) -> Int
{return 1}

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! myTableViewCell

    cell.myLabel.text = myArray[indexPath.row]

    return cell
}
}

(myTableViewCell保持不变)

这个设置只输出一个空表,即使我所做的只是将代码从ViewController复制粘贴到myDataSource。我错过了什么? (除了代表之外。我稍后会处理这个问题,首先我需要找到数据源的问题)。 我是一个快速的新秀,所以我真的很难理解我在这里出错的地方。任何帮助都将非常感激。如果你能在回答中记得我刚刚开始,那么尽量不要向我提出太多复杂的概念而不解释。谢谢

2 个答案:

答案 0 :(得分:3)

您的数据源中的代码可能永远不会被调用,因为您的数据源不会被表myTableView.dataSource = myDataSource()保留,因此基本上会立即释放。要解决此问题,请将数据源保留为属性。

答案 1 :(得分:0)

将单独的类声明为function toggleMenu() { if($('#menu').hasClass('.mm-opened')) { API.close(); } else { API.open(); } } // alternative function toggleMenu() { if($('#menu').is(':visible')) { API.close(); } else { API.open(); } }

的扩展名
ViewController

我正在使用也总是在扩展声明中委托方法,但在与主类

相同的文件中