我有一个在UITableView
内显示的视图,其中包含用户可以选择的不同标记。该观点的目的是能够选择多个标签并搜索特定标签。
This is what the view look like
现在我可以选择多个选项但是当我尝试在我的标签之间搜索时出现错误
fatal error: unexpectedly found nil while unwrapping an Optional value
到目前为止,这是我的代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:TagCell! = tableView.dequeueReusableCellWithIdentifier("TagCell"/*, forIndexPath: indexPath*/) as TagCell
if (cell == nil) {
cell = TagCell(style: UITableViewCellStyle.Default, reuseIdentifier: "TagCell")
}
var tag_:Tag = Tag()
if (tableView == searchDisplayController!.searchResultsTableView) {
tag_ = filteredTags_[indexPath.row]
}
else {
tag_ = Tags_[indexPath.row]
}
if (tag_.isSelected_ == true) {
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}
else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
cell.TG_Name_.text = tag_.TG_Name_
return cell
}
如果我理解正确,当我在搜索代码时,我的UITableView
与通常的TableView
不同,而新的var cell:TagCell! = tableView.dequeueReusableCellWithIdentifier("TagCell"/*, forIndexPath: indexPath*/) as TagCell
是空的或类似的东西
当我改变时:
var cell:TagCell! = self.tableView.dequeueReusableCellWithIdentifier("TagCell"/*, forIndexPath: indexPath*/) as TagCell
到
UITableView
错误消失但我正在搜索时勾选标记消失(不同class TagCell: UITableViewCell {
@IBOutlet weak var TG_Name_: UILabel!
@IBOutlet weak var cardView: UIView!
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
self.cardSetup()
}
func cardSetup () {
/*self.cardView.alpha = 1
self.cardView.layer.masksToBounds = false
self.cardView.layer.cornerRadius = 1; // if you like rounded corners
self.cardView.layer.shadowOffset = CGSizeMake(-0.2, 0.2); //%%% this shadow will hang slightly down and to the right
self.cardView.layer.shadowRadius = 1; //%%% I prefer thinner, subtler shadows, but you can play with this
self.cardView.layer.shadowOpacity = 0.2; //%%% same thing with this, subtle is better for me*/
}
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
)
这真令人沮丧。
有人能帮助我吗?
编辑:
这是我的TagCell.swift 我在其他视图中使用这种Cell用于其他TableView
class TagViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchDisplayDelegate {
@IBOutlet var tableView: UITableView!
//List of Tag
var Tags_:[Tag] = [Tag]()
//search
var filteredTags_:[Tag] = [Tag]()
//?
//var selectedTags_:[Tag] = [Tag]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//self.tableView.registerClass(TagCell.self, forCellReuseIdentifier: "TagCell")
self.loadTags()
}
func loadTags() {
if (Tags_.isEmpty) {
Tags_ = Repo_Tag().getAllTags()
}
}
@IBAction func cancelButton(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func doneButton(sender: AnyObject) {
}
func tableView(tableView_: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
var tag_:Tag = Tag()
var cell:TagCell! = tableView.cellForRowAtIndexPath(indexPath) as TagCell
var count:Int = 0
if (tableView == searchDisplayController!.searchResultsTableView) {
tag_ = filteredTags_[indexPath.row]
}
else {
tag_ = Tags_[indexPath.row]
}
if (tag_.isSelected_ == true) {
tag_.isSelected_ = false
cell.accessoryType = UITableViewCellAccessoryType.None
}
else {
tag_.isSelected_ = true
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}
//self.tableView.reloadData()
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return CGFloat(50)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (tableView == self.searchDisplayController!.searchResultsTableView) {
return self.filteredTags_.count
}
return Tags_.count
}
func tableView(tableView_: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:TagCell! = tableView_.dequeueReusableCellWithIdentifier("TagCell", forIndexPath: indexPath) as TagCell
if (cell == nil) {
//tableView_.registerClass(TagCell.self, forCellReuseIdentifier: "TagCell")
cell = NSBundle.mainBundle().loadNibNamed("TagCell", owner: self, options: nil)[0] as TagCell
}
var tag_:Tag = Tag()
if (tableView == searchDisplayController!.searchResultsTableView) {
tag_ = filteredTags_[indexPath.row]
}
else {
tag_ = Tags_[indexPath.row]
}
if (tag_.isSelected_ == true) {
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}
else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
cell.TG_Name_.text = tag_.TG_Name_
return cell!
}
//Functions to take care of the search
func filterContentForSearchText(searchText: String) {
// Filter the array using the filter method
self.filteredTags_ = self.Tags_.filter({( tag: Tag) -> Bool in
let stringMatch = tag.TG_Name_.rangeOfString(searchText)
return (stringMatch != nil)
})
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
self.filterContentForSearchText(searchString)
return true
}
func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchScope searchOption: Int) -> Bool {
self.filterContentForSearchText(self.searchDisplayController!.searchBar.text)
return true
}
func searchDisplayController(controller: UISearchDisplayController, willHideSearchResultsTableView tableView: UITableView) {
self.tableView.reloadData()
}
}
这是我的TagViewController
self.tableView.registerClass(TagCell.self, forCellReuseIdentifier: "TagCell")
当我发表评论时
{{1}}
我没有错误 当我在viewDidLoad中取消注释时,没有任何东西可以工作了。
答案 0 :(得分:0)
问题是你还没有注册正确的单元类/ NIB,虽然看起来你已经注册了一些单元格,因为你只有1次崩溃。
因此,在一个实例中,您会遇到崩溃,因为您要求的单元格不存在并尝试将其设置为强制变量。
在另一种情况下,您会获得一个单元格,但它不是已配置的TagCell
。
我猜你可能做的是将单元格类注册为TagCell
,但是你应该在故事板原型中注册一个XIB或命名该单元格。很难准确说出你需要什么,但是你应该阅读你正在使用的出列方法以及如何注册单元格的文档。