How to programmatically select a row in UITableView in Swift

前端 未结 7 560
执笔经年
执笔经年 2020-12-24 04:52

I need to select a row in a UITableView programmatically using Swift 1.2.

This is the simple code:

var index = NSIndexPath(forRow: 0, inSection: 0)
         


        
相关标签:
7条回答
  • 2020-12-24 05:07

    Swift 3.x

    if you want to do it at the 'cell-creation', you can do it like this

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = TableViewCell()
        let item = items[indexPath.row]
    
        cell.textLabel?.text    = item.title
    
        if (item.checked) {
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
        }
    
        return cell
    }
    
    0 讨论(0)
  • 2020-12-24 05:14

    The statement

    self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
    

    assumes that tableView is a property of the view controller, connected to a table view in the Storyboard. A UITableViewController, for example, already has this property.

    In your case, the view controller is a not a table view controller but a subclass of a UIViewController. It also has an outlet that is connected to the table view, but it is not called tableView but menuTable. Then of course you have to call

    self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
    

    to select a row of that table view.

    The strange error messages are caused by the fact that self.tableView can also be understood by the compiler as a "curried function" (compare http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/).

    0 讨论(0)
  • 2020-12-24 05:17

    Swift 3 to Swift 5 Solution

    Selecting a Row

    let indexPath = IndexPath(row: 0, section: 0)
    myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
    myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
    

    DeSelecting a Row

    let deselectIndexPath = IndexPath(row: 7, section: 0)
    myTableView.deselectRow(at: deselectIndexPath, animated: true)
    myTableView.delegate?.tableView!(myTableView, didDeselectRowAt: indexPath)
    
    0 讨论(0)
  • 2020-12-24 05:17

    Swift 4.2:

    Select one or more Rows

    let ndx:IndexSet = [1]
    // or:  let ndx:IndexSet = [1, 2, 3]; // etc
    tableview?.selectRowIndexes(ndx, byExtendingSelection: false);
    

    Deselect a Single Row

    tableview?.deselectRow(current)
    

    Note that if you have (func tableViewSelectionDidChange(...)) implemented, that will be triggered by the above.

    Also see Charlton Provatas' answer at https://stackoverflow.com/a/48696458/352920 for an extension to NSTableView, that provides a simple

    tableview?.selectRow(at:) 
    
    0 讨论(0)
  • 2020-12-24 05:18

    Use below code,after loading your table view with data:

    let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0);  //slecting 0th row with 0th section
    self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);
    

    now,you have to manually call didSelectRowAtIndexPath: delegate method using below code:

    self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select
    

    Thanks.

    0 讨论(0)
  • 2020-12-24 05:20

    Using Swift 2.x, as described by Pankaj purohit answers the correct method is:

    func tapRowAtIndex(index:Int) {
            let rowToSelect:NSIndexPath = NSIndexPath(forRow: index, inSection: 0)
            self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None)
            self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect)
    }
    

    Keep in mind that if you call this method from an external class for example, you dont know when tableView has finished its loading, so what's the possibilities?, how to workaround this problem? :

    Step one: create a class boolean var

    var automatingTap: Bool = false
    

    Step two: check when the table finish its loading and launch an "end operations" method:

    func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 
    {
        let lastRowIndex = tableView.numberOfRowsInSection(0)
        if indexPath.row == lastRowIndex - 1 {
           endOperations()
        }
    }
    
    func endOperations() 
    {
       print("finished loading")
       if automatingTap {
            tapRowAtIndex(0)
            automatingTap = false
       }
    }
    

    Step three: call my tableView class from another class

    for example:

    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if segue!.identifier == "DetailsTableView" {
            let viewController:ViewController = segue!.destinationViewController as ViewController
            viewController.automatingTap = true
        }
    }
    
    0 讨论(0)
提交回复
热议问题