在UITableViewController(结果控制器)中使用UISearchController的自定义单元格

时间:2016-03-01 10:08:24

标签: ios swift uitableview custom-cell uisearchcontroller

我正在尝试实现一个UISearchController(不推荐使用的UISearchDisplayController)

我面临着一个荒谬的时间吃饭问题。

当我尝试dequeueResusableCellWithIdentifier时,它不适用于我的CellAutocompletion(UITableViewCell子类化)

像这样:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let item = filteredProducts[indexPath.row]

    let cell:CellAutocompletion = self.tableView.dequeueReusableCellWithIdentifier("suggestionCell") as! CellAutocompletion

    cell.itemLabel?.text = item.item_name;

    return cell
}

这会让我fatal error: unexpectedly found nil while unwrapping an Optional value

但是当我这样做时:

    let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "suggestionCell");

有效。因此,对于默认iOS单元格,它可以使用我的自定义单元格。有什么想法吗?

我想我问的是错误的tableview但是考虑到我在另一个VC使用的UISearchController中包含的TableviewController里面,我迷路了。

我的主VC ,它实现了我的searchController和我遇到问题的TableViewController。

    //ViewDidLoad
    resultsTableController = ProductResultTabController();
    resultsTableController.tableView.delegate = self;

    self.searchController = UISearchController(searchResultsController: resultsTableController);
    searchController.searchResultsUpdater = self;
    searchController.dimsBackgroundDuringPresentation = true;

    searchController.searchBar.sizeToFit()
    tableView.tableHeaderView = searchController.searchBar

我的CustomCell类

class CellAutocompletion:UITableViewCell{

@IBOutlet weak var itemLabel: UILabel!
@IBOutlet weak var parentItemLabel: UILabel!

}

ProductResultTabController (TableViewController的子类)

class ProductResultTabController: UITableViewController {
var filteredProducts = [ITEM]();

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

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let item = filteredProducts[indexPath.row]

    let cell:CellAutocompletion = self.tableView.dequeueReusableCellWithIdentifier("suggestionCell") as! CellAutocompletion!

    cell.itemLabel?.text = item.item_name;

    return cell
}


}

1 个答案:

答案 0 :(得分:4)

根据我的理解,您的ProductResultTabController与电池原型一起存在于故事板中。因此,调用resultsTableController = ProductResultTabController()并不是创建TableViewController最重要的部分,它正在为一个类或nib注册tableView :.您可以在笔尖中创建自己的单元格并在PRTC tableview.registerNib:中调用viewDidLoad:,但还有一种更方便的方式:

  1. 在故事板中创建您的PRTC并对单元格进行原型设计(我相信您已经这样做了)
  2. 在SB中,转到属性检查器并为控制器提供故事板ID
  3. Giving a storyboard ID in Attributes Inspector

    3 - 在你的主要VC viewDidLoad:中,用以下内容替换resultsTableController = ProductResultTabController()`:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    resultsTableController = storyboard.instantiateViewControllerWithIdentifier(myStoryboardID)