title: Subclassing SLKTextViewController
body: <p>I have a ViewController with a tableview that runs correctly. </p>
  
  <p>Now I am trying to subclass <a href="https://github.com/slackhq/SlackTextViewController/tree/swift-example/Source/Classes" rel="nofollow">SLKTextViewController</a> but the app now crashes. Have I subclassed it incorrectly (following <a href="https://github.com/agameofprivacy/AbilityConnect/blob/c0ccd1dc6658bd67911b3599227e5f6ad3f75e70/ProjectGoingDeep/CommentsTextViewController.swift" rel="nofollow">this example</a>)?</p>
  
  <h3>SLKTextViewController SubClass:</h3>
  
  <pre><code>import UIKit
  
  class CommentsTextViewController: SLKTextViewController {
  
      var foodPhotoObject: PFObject?
      var userNameText = ""
      var distanceLabelText = ""
      var userPhotoUIImage: UIImage?
      var mainRestaurantUIImage: UIImage?
  
      // get comment arrays
      var photoCommentObjects: [AnyObject] = []
      var commentUsers: [PFUser] = []
      var commentText: [String] = []
  
      @IBOutlet var mainRestaurantImageView: PFImageView!
      @IBOutlet var userPhoto: UIImageView!
      @IBOutlet var userName: UIButton!
      @IBOutlet weak var distanceLabel: UILabel!
  
      override func viewDidLoad() {
          super.viewDidLoad()
  
          setupTableViewCells()
  
          // load comments
          fetchComments()
          self.tableView.registerClass(CommentsCell.self, forCellReuseIdentifier: "CommentCell")
          self.tableView.rowHeight = UITableViewAutomaticDimension
          self.tableView.estimatedRowHeight = 80
          self.tableView.backgroundColor = UIColor.clearColor()
          self.tableView.delegate = self
          self.tableView.dataSource = self
          self.tableView.scrollsToTop = true
          self.bounces = true
          self.keyboardPanningEnabled = true
          self.inverted = true
          self.tableView.frame = self.view.frame
          self.textView.placeholder = "Comment"
          self.textView.placeholderColor = UIColor(red: 0.75, green: 0.75, blue: 0.75, alpha: 1)
          self.textView.layer.borderColor = UIColor(red: 0.75, green: 0.75, blue: 0.75, alpha: 1).CGColor
          self.textView.pastableMediaTypes = SLKPastableMediaType.None
          self.rightButton.setTitle("Post", forState: UIControlState.Normal)
          self.textInputbar.autoHideRightButton = true
          self.textInputbar.maxCharCount = 140
          self.textInputbar.counterStyle = SLKCounterStyle.Split
  //        // Do any additional setup after loading the view.
      }
  
      func setupTableViewCells() {
          userName.setTitle(userNameText, forState: .Normal)
          distanceLabel.text = distanceLabelText
          userPhoto.image = userPhotoUIImage
          // make profile photo circular
          userPhoto.layer.cornerRadius = userPhoto.frame.size.width / 2;
          userPhoto.layer.masksToBounds = true;
          userPhoto.layer.borderWidth = 0 // remove border
  
          mainRestaurantImageView.image = mainRestaurantUIImage
          mainRestaurantImageView.contentMode = .ScaleAspectFill
          mainRestaurantImageView.clipsToBounds = true
  
          tableView.estimatedRowHeight = 44.0
          tableView.rowHeight = UITableViewAutomaticDimension
      }
  
      func fetchComments() {
  
          var query = PFQuery(className:"Activity") //default: Restaurant
          query.whereKey("Photo", equalTo:foodPhotoObject!) // find photos equal to
          query.whereKey("Type", equalTo:"Comment")
          query.includeKey("FromUser")
          query.orderByDescending("createdAt")
          query.findObjectsInBackgroundWithBlock {
              (objects: [AnyObject]?, error: NSError?) -&gt; Void in
              if objects!.isEmpty { //if objects != nil {
                  //NO RESULTS
                  println("NO COMMENTS FOUND") //allow user to input zipcode
                  // check if activity indicator is animating
                  self.stopActivityIndicator()
              } else {
                  println(objects)
                  self.photoCommentObjects = objects!
  
                  self.commentUsers = self.photoCommentObjects.map { $0.objectForKey("FromUser") as! PFUser }
                  self.commentText = self.photoCommentObjects.map { $0.objectForKey("Content") as! String }
  
                  dispatch_async(dispatch_get_main_queue(), { () -&gt; Void in
                      self.tableView.reloadData()
                  })
              }
          }
      }
  
      override func didReceiveMemoryWarning() {
          super.didReceiveMemoryWarning()
          // Dispose of any resources that can be recreated.
      }
  
      override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {
          let cell = tableView.dequeueReusableCellWithIdentifier("CommentCell", forIndexPath: indexPath) as! CommentsCell
          // START: Get comment date
          let dateCreated = photoCommentObjects[indexPath.row].createdAt as NSDate!
          let dateFormat = NSDateFormatter()
          dateFormat.dateFormat = "EEE, MMM d, h:mm a"
          dateFormat.dateStyle = .ShortStyle
          dateFormat.timeStyle =  .NoStyle
          dateFormat.doesRelativeDateFormatting = true
          cell.timeLabel.text = NSString(format: "%@", dateFormat.stringFromDate(dateCreated)) as String
          cell.commentLabel.text = commentText[indexPath.row]
          //cell.commentLabel.adjustsFontSizeToFitWidth = true
          cell.commentLabel.preferredMaxLayoutWidth = 300
  
  
          // START: Get username out of the PFUser array
          let commentUser: PFUser = self.commentUsers[indexPath.row]
          let commentUserName: String = commentUser.objectForKey("username") as! String
  
          cell.userName.setTitle(commentUserName, forState: .Normal)
  
  
  
          // START: Get Profile Photo
          // get profile PFFile
          var getProfilePhoto: PFFile! = commentUser.objectForKey("profilePhoto") as? PFFile
  
          // get UIImage from PFFile
          if (getProfilePhoto != nil) { // if there is a profilephoto
              getProfilePhoto.getDataInBackgroundWithBlock {
                  (imageData: NSData?, error: NSError?) -&gt; Void in
                  if error == nil {
                      let image = UIImage(data:imageData!)
                      cell.userPhoto.image = image
                      println("this image3 \(image)")
  
                      //                                self.uploadPhoto.hidden = true // hide "Upload Photo Button"
                      cell.userPhoto.layer.cornerRadius = cell.userPhoto.frame.size.width / 2;
                      cell.userPhoto.layer.masksToBounds = true;
                      cell.userPhoto.layer.borderWidth = 0 // remove border
                  }
              }
          } else { // there is no profile photo (use default
  
              // set default profile photo
              cell.userPhoto.image = UIImage(named: "Tasteup-Icon")
              cell.userPhoto.layer.cornerRadius = cell.userPhoto.frame.size.width / 2;
              cell.userPhoto.layer.masksToBounds = true;
              cell.userPhoto.layer.borderWidth = 0 // remove border
          }
  
          return cell
  
      }
  
      override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -&gt; CGFloat {
          return 80
      }
  
      override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
          return self.photoCommentObjects.count
      }
  
      override func numberOfSectionsInTableView(tableView: UITableView) -&gt; Int {
          return 1
      }
  
      override func didPressRightButton(sender: AnyObject!) {
          self.textView.refreshFirstResponder()
          var comment:String = self.textView.text
          self.tableView.beginUpdates()
          self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: UITableViewRowAnimation.Automatic)
          self.tableView.endUpdates()
  
          self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)
          super.didPressRightButton(sender)
      }
  }
  </code></pre>
  
  <h3>Error:</h3>
  
  <pre><code>2015-05-13 22:04:30.890 App[39965:1524334] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
  *** First throw call stack:
  (
      0   CoreFoundation                      0x0000000110e77c65 __exceptionPreprocess + 165
      1   libobjc.A.dylib                     0x000000011366abb7 objc_exception_throw + 45
      ...
      24  UIKit                               0x000000011239e900 UIApplicationMain + 1282
      25  TasteUp                             0x000000010fdbf077 main + 135
      26  libdyld.dylib                       0x00000001159ab145 start + 1
  )
  libc++abi.dylib: terminating with uncaught exception of type NSException
  </code></pre>