在Tweetbot中,在搜索期间向tableView添加节和行

时间:2015-11-09 11:07:24

标签: ios swift uitableview

我正在尝试创建一个非常类似于Tweetbot的搜索视图控制器,其中向搜索栏添加文本会在tableView中插入新的部分和新行, like so

我尝试过使用searchBar委托方法searchBarTextDidBeginEditingsearchBar(_:, textDidChange:)但我尝试在方法中插入新的部分和行会导致崩溃。

我尝试了什么:

    tableView.beginUpdates()

    tableView.insertSections(NSIndexSet(index: 0), withRowAnimation: .None)

    tableView.insertRowsAtIndexPaths(
        [
            NSIndexPath(forRow: 0, inSection: 0),
            NSIndexPath(forRow: 1, inSection: 0),
            NSIndexPath(forRow: 2, inSection: 0)
        ],

        withRowAnimation: .None)

    tableView.endUpdates()

我得到的错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Invalid update: invalid number of sections.  The number of sections contained in the table 
view after the update (3) must be equal to the number of sections contained in the table 
view before the update (3), plus or minus the number of sections inserted or deleted
(1 inserted, 0 deleted).'
*** First throw call stack:
(0x181a19900 0x181087f80 0x181a197d0 0x18238c99c 0x18695c724 0x10008b578 
0x10008b5e8 0x18696d0a0 0x18679bc48 0x18679bbc4 0x186783880 0x186782bfc 
0x18677ef98 0x186875268 0x18696cdfc 0x18696fe60 0x1869c817c 0x18696d02c 
0x1867eca24 0x10029004c 0x1867ecea4 0x186873d38 0x186924b84 0x186924038 
0x186ce2a18 0x186909158 0x1867967a8 0x186ce4018 0x186755960 0x1867526e4 
0x186794618 0x186793c14 0x1867642c4 0x18676258c 0x1819d0efc 0x1819d0990 
0x1819ce690 0x1818fd680 0x182e0c088 0x1867cd40c 0x100123594 0x18149e8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

调用tableView.endUpdates()后,您的表视图将调用其UITableViewDataSource委托,并且它希望tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int方法返回3.(因为您在第一部分中添加了3行)。< / p>

尝试这样的事情:

声明新属性:

var showSearchSelection = false

搜索:

tableView.beginUpdates()

tableView.insertSections(NSIndexSet(index: 0), withRowAnimation: .None)

tableView.insertRowsAtIndexPaths(
    [
        NSIndexPath(forRow: 0, inSection: 0),
        NSIndexPath(forRow: 1, inSection: 0),
        NSIndexPath(forRow: 2, inSection: 0)
    ],

    withRowAnimation: .None)

showSearchSelection = true

tableView.endUpdates()

UITableViewDataSource委托:

extension UIViewController : UITableViewDataSource {

    public func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }

    public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch section:
        case 0:
            return showSearchSelection ? 3 : 0
        default:
            return 0
    }
}