静态tableview单元格

时间:2016-07-13 09:16:58

标签: ios swift xcode

我想在静态tableview单元格中填充一个动态的tableview,由同一个类填充这两个。 正如您在单元格' GRE测试信息'下的图片中所见。

Helping Picture

我使用名为MenuController的类中的代码,这是一个tableview控制器。

class MenuController: UITableViewController,MFMailComposeViewControllerDelegate        {

@IBOutlet weak var tablle: UITableView!

var items = [String]()
override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    items = ["A  "," BB "]

    tablle.delegate = self
    tablle.dataSource = self

    self.tablle.registerClass(MainTableViewCell.self, forCellReuseIdentifier: "cellNew")
}


// Table Data Source

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
    -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell

        print("Aasim Khaan")

        cell.customCell01.text = items[indexPath.row]


        return cell
}


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

但它并没有在运行时填充,并说

由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无法使用标识符cellNew出列单元格 - 必须为标识符注册一个nib或类或连接原型故事板中的单元格'

但是我在代码和故事板中使用了名为 cellNew 的相同标识符。

4 个答案:

答案 0 :(得分:2)

经过对这一次的惊人努力之后,我找到了解决方案。 关于以下内容: Swift: TableView within Static UITableViewCell

问题解决者说:我可以通过试验来确定,你不能使用相同的UITableViewController作为两个表视图的数据源和委托。使用静态表视图,您根本不应该实现数据源方法。奇怪的是,即使我断开数据源并委托我的静态表视图和表视图控制器之间的连接,该表视图仍然在我的表视图控制器类中调用numberOfRowsInSection。如果我在代码中将数据源显式设置为nil,则会阻止它调用数据源方法,但嵌入式动态表视图也无法调用它们,因此这种结构不起作用。

但是,您可以通过使用其他对象作为嵌入式动态表视图的数据源和委托来解决此问题。为嵌入式表视图创建一个IBOutlet,并设置其数据源并委托给这个新对象(该示例中的类是DataSource,它是NSObject的子类)。

我现在以这种方式修改了我的代码:

import Foundation
import UIKit
import MessageUI

class DataSource: NSObject, UITableViewDataSource, UITableViewDelegate {

var items : [String] = ["GRE Test Structure ","GRE Score "]

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1;
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2;
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell
        cell.customCell01.text = items[indexPath.row]
        return cell
    }
}


class MenuController: UITableViewController,MFMailComposeViewControllerDelegate {

  @IBOutlet var tablle0: UITableView!
  @IBOutlet weak var tablle: UITableView!
  var dataSource = DataSource()

  override func viewDidLoad() {
      super.viewDidLoad()

      // Uncomment the following line to preserve selection between presentations
      // self.clearsSelectionOnViewWillAppear = false

      // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
      // self.navigationItem.rightBarButtonItem = 
      self.editButtonItem()
      tablle.delegate = dataSource
      tablle.dataSource = dataSource
  }

}

现在它运作正常。

Here is the result shown by a screenshot

答案 1 :(得分:0)

在viewDidLoad

// First Register the UITableViewcell class from nib 
let cellNib = UINib(nibName: "MainTableViewCell", bundle: bundle)
self.tableView.registerNib(cellNib, forCellReuseIdentifier:"cellNew")

然后检查下面的screeshots

第1步:从Identity Inspector-Custom Class-Click Class下拉箭头中选择MainTableViewCell。它显示列表。从中可以单击MainTableViewCell

enter image description here

第2步:点击它后,它会显示包含所选表格视图单元格的名称。

enter image description here

答案 2 :(得分:0)

虽然现有的答案解释 你可以如何做到这一点,但他们不会解决是否你应该这样做。从您提供的示例中,您似乎只需要具有多个动态单元类型的 UITableView。每个单元格类型都可以指定其contentInsets以根据需要缩进内容。

答案 3 :(得分:0)

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'无法将单元格出列   标识符为cellNew - 必须注册一个nib或类   标识符或连接故事板'

中的原型单元格      

但是,我在使用名为cellNew的相同标识符   代码和故事板。

您收到此错误是因为您正在从错误的表格中取消/检索原型单元格!

cellForRowAtIndexPath中的行应为:

let cell = tablle.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell

话虽如此,即使一旦工作,要求tableViewController充当静态和动态表的数据源和委托会导致问题。