简体   繁体   中英

Swift instantiating a UIViewController and adding as subview in same file

I am extreeemely new to Swift and native iOS developement.

I was succesfully able to create a label in Swift and it showing in my app like this:

import UIKit
import SpreadsheetView

class SampleView: UIView {

  override init(frame: CGRect) {
    super.init(frame: frame)

    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
    label.text = "This is Swift"
    self.addSubview(label)

  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

}

However I now need to add a SpreadsheetView - from here - https://github.com/kishikawakatsumi/SpreadsheetView

Instead of adding a label my code changes to this:

import UIKit
import SpreadsheetView

class ViewController: UIViewController, SpreadsheetViewDataSource {
  @IBOutlet weak var spreadsheetView: SpreadsheetView!

  override func viewDidLoad() {
    super.viewDidLoad()
    spreadsheetView.dataSource = self
  }

  func numberOfColumns(in spreadsheetView: SpreadsheetView) -> Int {
    return 200
  }

  func numberOfRows(in spreadsheetView: SpreadsheetView) -> Int {
    return 400
  }

  func spreadsheetView(_ spreadsheetView: SpreadsheetView, widthForColumn column: Int) -> CGFloat {
    return 80
  }

  func spreadsheetView(_ spreadsheetView: SpreadsheetView, heightForRow row: Int) -> CGFloat {
    return 40
  }
}

class SampleView: UIView {

  override init(frame: CGRect) {
    super.init(frame: frame)

    let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "ViewController");
    self.addSubview(controller.view);
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

}

However while running I get a SIGABRT, am I going about this the right way. I see lots of articles on adding controllers like this one - Adding View controllers as subview in Swift - but may you please help me with this above case.

Here is my screenshot:

尝试这个:

let controller = ViewController()

You don't need your SampleView class. I think you got confused because of that @IBOutlet weak var spreadsheetView: SpreadsheetView! . You don't have to follow this procedure. You just create an instance and use it accordingly.

If you are trying to make your view a SpreadsheetView just use it like below way:

import UIKit
import SpreadsheetView

class ViewController: UIViewController, SpreadsheetViewDataSource {

    let spreadsheetView = SpreadsheetView()  //have an SpreadsheetView

    override func viewDidLoad() {
        super.viewDidLoad()

        spreadsheetView.dataSource = self
        self.view = spreadsheetView  //set your controller's container view as that spreadsheetView
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    func numberOfColumns(in spreadsheetView: SpreadsheetView) -> Int {
        return 200
    }

    func numberOfRows(in spreadsheetView: SpreadsheetView) -> Int {
        return 400
    }

    func spreadsheetView(_ spreadsheetView: SpreadsheetView, widthForColumn column: Int) -> CGFloat {
        return 80
    }

    func spreadsheetView(_ spreadsheetView: SpreadsheetView, heightForRow row: Int) -> CGFloat {
        return 40
    }

}


Edit: different approach

If you still want to use @IBOutlet approach, see the below image and follow step by step (1-2-3-4) 用SpreadsheetView连接视图

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM