UIView中的UITableView与swift

Posted

技术标签:

【中文标题】UIView中的UITableView与swift【英文标题】:UITableView in UIView with swift 【发布时间】:2015-06-27 01:38:01 【问题描述】:

我整天都被这个问题所困扰,仍然不知道为什么这个问题如此难以解决。我一直在尝试让一个简单的 UITableview 工作。我设法让它出现在屏幕上(悲伤的泪水),但我无法让表格视图更新或做任何事情。

请务必注意,我的 UITableView 位于我在 UIViewController 中调用的 UIView 类中。

这是我的 UIView 类:

import Foundation
import UIKit

class comebackViewController:UIView
@IBOutlet var table: UITableView!

 func setup()

     table = UITableView()

 


这是我的主要 UIViewController:

import UIKit

class ViewCont: UIViewController, UITableViewDataSource, UITableViewDelegate
var tableViewCont:comebackViewController!
var ListArray:NSMutableArray = []

override func viewDidLoad() 
    super.viewDidLoad()
    ListArray.addObject("hello")
    ListArray.addObject("goodbye")

    print(ListArray.count)

    tableViewCont = NSBundle.mainBundle().loadNibNamed("comebackTableView", owner: self, options: nil).last as! comebackViewController
    tableViewCont.frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.height)
    tableViewCont.table = UITableView()
    tableViewCont.setup()
    tableViewCont.table.dataSource = self
    tableViewCont.table.delegate = self
    tableViewCont.table.registerClass(tableViewCellController.self, forCellReuseIdentifier: "cell")

    //Some people say you have to call reloadData like this...
    dispatch_async(dispatch_get_main_queue(),  () -> Void in
        self.tableViewCont.table.reloadData()
        //let indexPath = NSIndexPath(forRow: 0, inSection: 0)
        //self.tableViewCont.table.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    )

    tableViewCont.table.reloadData()

    self.view.addSubview(tableViewCont)



func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 
    print("did get count...\n")
    return self.ListArray.count;


func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    print("did get height...\n")
    return 44


func numberOfSectionsInTableView(tableView: UITableView!) -> Int 
    print("did get number of sections...\n")
    return 2


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    print("table did reload...\n")
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! tableViewCellController

    cell.random1.text = "\(ListArray.objectAtIndex(indexPath.row))"
    cell.random2.text = "me"
    /*
    if let desc = self.items[indexPath.row]["description"] as? NSString   
    cell.detailTextLabel.text = desc
    */

    return cell



当我尝试运行此代码时,终端会打印出来

did get number of sections...
did get count...
did get height...
did get height...
did get count...
did get height...
did get height...

这意味着当我调用 reloadData() 函数时,它会被调用,但表中没有任何内容。另外,当我调用 reloadData() 时,我从来没有看到“table did reload ...\n”打印到屏幕上。这意味着永远不会向表格中添加任何单元格。

注意:我已经在 Objective-c 中完成了这项工作,但 swift 对我来说似乎有点困难。而且我知道有人会告诉我,我必须有一个 UITableViewController,但表必须在我的应用程序的单独 UIView 中,谢谢!

【问题讨论】:

检查你的tableView的大小,可能是零。 【参考方案1】:

出现这种行为是因为 tableView 的大小为零:

tableViewCont = NSBundle.mainBundle().loadNibNamed("comebackTableView", owner: self, options: nil).last as! comebackViewController
tableViewCont.frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.height)
tableViewCont.table = UITableView()
tableViewCont.setup() // you instantiate a new UITableView

你应该在实例化后设置它的框架:

tableViewCont = NSBundle.mainBundle().loadNibNamed("comebackTableView", owner: self, options: nil).last as! comebackViewController
tableViewCont.setup()
tableViewCont.frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.height)

【讨论】:

这很棒!我可能永远不会发现,谢谢。

以上是关于UIView中的UITableView与swift的主要内容,如果未能解决你的问题,请参考以下文章

更新 UITableView 内的 UIView 帧大小 - swift

Swift:UIView 出现在 UITableView 单元格中

Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度

需要帮助创建复杂的 UIView - Swift xCode [关闭]

UITableView 单元格中的动态形状(Swift)

UIView 子类在 Swift 中设置自己的高度 + UIViewController 中的约束 + 情节提要