Here is a working example. You use your scroll view properties, Inset and scrollIndicatorInsets, to prevent the keyboard from appearing when it appears. You must register to be notified of the keyboard. Use the information in notifications to determine the size of the keyboard - you never know what it will be.
Using content pasting is the right way to handle this for scrolling. If you later need to scroll the edit line in the view, use UITableView.scrollToRowAtIndexPath (_ :, atScrollPosition :, animated :)
Note that he is doing the right thing when the user hides / shows the completion panel.
import UIKit import CoreGraphics // our Cell class class Cell : UITableViewCell { // cell reuse identifier for table view static let Identifier = "Cell" // the object the cell represents/displays. Could be anything you like var value:AnyObject? { didSet { // update our text field when our cell value is set. self.textField.text = value as? String } } // use a text field to display our contents, since that allows editing and showing the keyboard lazy var textField:UITextField = { let textField = UITextField() self.contentView.addSubview( textField ) return textField }() override func layoutSubviews() { super.layoutSubviews() self.textField.frame = contentView.bounds.insetBy(dx: 20, dy: 4 ) } } // table view data source class class DataSource : NSObject, UITableViewDataSource { var numberOfRows:Int { return items.count } let items = [ "Seoul", "São Paulo", "Bombay", "Jakarta", "Karachi", "Moskva", "Istanbul", "Mexico", "Shanghai", "Tokyo", "New" York, "Bangkok", "Beijing", "Delhi", "London", "Hong Kong", "Cairo", "Tehran", "Bogota", "Bandung", "Tianjin", "Lima", "Rio de Janeiro", "Lahore", "Bogor", "Santiago", "St Petersburg", "Shenyang", "Calcutta", "Wuhan" ] func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return numberOfRows } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier( Cell.Identifier ) as? Cell ?? Cell() cell.value = items[ indexPath.row ] return cell } } class ViewController : UIViewController { override func viewDidLoad() { super.viewDidLoad() // register for notifications when the keyboard appears: NSNotificationCenter.defaultCenter().addObserver( self, selector: "keyboardWillShow:", name: UIKeyboardWillChangeFrameNotification, object: nil) } override func viewDidLayoutSubviews() { tableView.frame = view.bounds } lazy var tableView:UITableView = { let tableView = UITableView() self.view.addSubview( tableView ) tableView.dataSource = self.dataSource tableView.delegate = self return tableView }() lazy var dataSource : DataSource = DataSource() // Handle keyboard frame changes here. // Use the CGRect stored in the notification to determine what part of the screen the keyboard will cover. // Adjust our table view contentInset and scrollIndicatorInsets properties so that the table view content avoids the part of the screen covered by the keyboard @objc func keyboardWillShow( note:NSNotification ) { // read the CGRect from the notification (if any) if let newFrame = (note.userInfo?[ UIKeyboardFrameEndUserInfoKey ] as? NSValue)?.CGRectValue() { let insets = UIEdgeInsetsMake( 0, 0, newFrame.height, 0 ) tableView.contentInset = insets tableView.scrollIndicatorInsets = insets } } } // need to conform to UITableViewDelegate protocol since we are the table view delegate extension ViewController : UITableViewDelegate { } // App set up stuff here: @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { lazy var window:UIWindow? = UIWindow() func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { window!.rootViewController = ViewController() window!.makeKeyAndVisible() return true } }