将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController

Posted

技术标签:

【中文标题】将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController【英文标题】:Loading a Custom UITableViewCell from nib to a UIViewController in Swift 【发布时间】:2015-12-12 06:35:24 【问题描述】:

我目前正在开发一个快速练习程序,该程序需要将 CoreData 结果显示在表格上。

我已经构建了我的应用程序,使情节提要本身不包含任何 UI 元素,仅包含视图(带有随附的 UIViewController 类),然后加载自定义 nib/xib(还带有 UIView 子类)。在这种情况下,xib 包含UITableView,而单独的 xib 包含单元格。

TableView 类

import UIKit

protocol SkillsViewDelegate


class SkillsView: UIView 
    var delegate : SkillsViewDelegate!
    @IBOutlet weak var skillsTable: UITableView!

TableView 控制器

import UIKit
import CoreData

class SkillsViewController: UIViewController, SkillsViewDelegate, UITableViewDataSource, UITableViewDelegate 
    var displaySkillsView : SkillsView!
    var displaySkillsCell : SkillViewCell!
    let textCellIdentifier = "skillViewCell"

    override func viewDidLoad() 
        super.viewDidLoad()

        self.displaySkillsView = UIView.loadFromNibNamed("SkillsView") as! SkillsView
        self.displaySkillsView.delegate = self
        self.view = self.displaySkillsView
        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    //MARK : -Table view delegates

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return 1
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath)

        return cell
    

TableCellView 类

import UIKit

protocol SkillsViewCellDelegate


class SkillViewCell: UITableViewCell 
    var delegate : SkillsViewCellDelegate!

    override func awakeFromNib() 
        super.awakeFromNib()
    

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

    @IBOutlet weak var skillName: UILabel!
    @IBOutlet weak var skillRank: UILabel!

我不知道如何将单元格 xib 调用到控制器中。我猜是like this problem,但不同的是这个人使用的是UITableViewController。我也尝试添加它,但我收到了Multiple inheritance from classes 'UIViewController' and 'UITableViewController' 来解决我的麻烦。

我尝试了什么: 我尝试在顶部添加UITableViewController,但我得到了Multiple inheritance from classes 'UIViewController' and 'UITableViewController' 来解决我的麻烦。

有什么建议吗?

【问题讨论】:

【参考方案1】:

您可以在 SkillsViewController 中注册 SkillsViewCell

对象 C

-(void)viewDidLoad 
   [super viewDidLoad];
   UINib *cellNib = [UINib nibWithNibName:@"NibName" bundle:nil];
   [self.skillsTable registerNib:cellNib forCellReuseIdentifier:textCellIdentifier];

斯威夫特 2

override func viewDidLoad() 
   super.viewDidLoad()
   let nibName = UINib(nibName: "NibName", bundle:nil)
   self.skillsTable.registerNib(nibName, forCellReuseIdentifier: textCellIdentifier)

斯威夫特 4

override func viewDidLoad() 
   super.viewDidLoad()
   let nibName = UINib(nibName: "NibName", bundle:nil)
   self.skillsTable.register(nibName, forCellReuseIdentifier: textCellIdentifier)

那么只能继承 UIViewController 而不是 UITableViewController

调用特定于您的自定义单元格的方法

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

    cell.skillName.text = "Some text"
    cell.skillRank.text = "Some text"
    return cell

【讨论】:

感谢您的快速回复。我实际上已经尝试过后者(很抱歉没有提到它),但我收到一条错误消息Ambiguous reference to member 'tableView' 可以将self.tableView改为self.skillsTable 啊,明白了。如何从cellForRowAtIndexPath 调用skillNameskillRank?到目前为止,我有这个:let cell = self.displaySkillsView.skillsTable.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) 谢谢。但是,细胞仍然没有出现。桌子肯定在那里,颜色为灰色。也许与代表有什么关系? 啊,明白了。我确实忘记设置委托和数据源。【参考方案2】:

我认为你需要使用

func registerNib(_ nib: UINib?, forCellReuseIdentifier identifier: String)

viewDidLoad

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/#//apple_ref/occ/instm/UITableView/registerNib:forCellReuseIdentifier:

【讨论】:

以上是关于将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义uitableviewcell一一附加到uitableview

将自定义 UITableViewCell 与 ViewCellRenderer 一起使用时出现 NullReferenceException

如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?

如何将自定义单元格连接到 UIViewController?

将自定义 UIView 添加到 TableViewCell

拆分视图控制器 - 自定义 UITableViewCell