Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically emulate the selection in UITableViewController in Swift

Sorry for the question without any line of code. I need advice how to proceed, if at possible that I want.

In Swift language.

Let us assume there is an app with two controllers - UITableViewController with embedded NavigationController, as the main. When you select a row in the table, opens UIViewController, which displays detailed information about the selected value.

Is it possible to do otherwise? When the application start, programmatically emulate the selection of the first row in the table and immediately display UIViewController with detailed information about the selected value. And from this controller possible to return to UITableViewController via the NavigationController.

Once again I apologize and thank you in advance!

like image 827
Alexey Nakhimov Avatar asked Jul 16 '14 17:07

Alexey Nakhimov


2 Answers

You can also do this simply by accessing the tableView delegate to force didSelectRowAtIndexPath to fire.

Programatically select a row to work with:

self.tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.Top)

Programatically selecting row does not fire the "didSelectRowAtIndexPath" function so we must manually force the firing as per below:

self.tableView.delegate!.tableView!(tableView, didSelectRowAtIndexPath: indexPath!)

Objective-C:

[self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:path];
like image 108
John Carto Avatar answered Nov 16 '22 09:11

John Carto


Yes you can do this in swift.Just load your tableViewController as usual.You just have to call

In Swift

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

The selectRowAtIndexPath function will not trigger delegate methods like didSelectRowAtIndexPath: so you have to manually trigger this delegate method

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

Or If you are pushing ViewControllers with segue you have to trigger performSegueWithIdentifier

    self.performSegueWithIdentifier("yourSegueIdentifier", sender: self);

Now you can push viewController in didSelectRowAtIndexpath.To select the first row in first section or execute whaterver you have written in didSelectRowAtIndexpath: of tableView

As For your case just push the viewController on select at 0th index with didSelectRowAtIndexPath

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){

    if indexPath.row == 0 {

        self.navigationController.pushViewController(yourViewControllerToPush, animated: YES);
    }
    //handle other index or whatever according to your conditions
}

It will show the view controller pushed and if you do not want to animate view controller just pass NO to pushViewController method.

On pressing Back button you will back to your viewController

In your case just write this in your viewDidAppear

if firstStart {
    firstStart = false
    let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition:UITableViewScrollPosition.None)
    self.performSegueWithIdentifier("showForecastSelectedCity", sender: self)
}
like image 24
codester Avatar answered Nov 16 '22 08:11

codester