Yoli Meydan
Yoli Meydan

Reputation: 161

Nib IBOutlet causes app to crash

Really need your help! I've been through every possible post addressing this issue and nothing seems to work.

So I'm using a .xib file to create a subview within ProfileFoldingCellView.swift, which works perfectly until I attempt to add an IBOutlet in the same class. Here's the code:

import Foundation
import UIKit

class ProfileFoldingCellView: UIView {

    @IBOutlet var mainLabel: UILabel!
    public var cellIndex: Int = 0

    init(index: Int) {
        super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

        cellIndex = index
        print("Index: \(cellIndex)")

        setupContentView()
    }

    func setupContentView() {
        let contentView = UINib(nibName: "ProfileFoldingCellView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
        contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        addSubview(contentView)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupContentView()
    }

}

As you can see, the label IBOutlet is created without any issues and there are no other outdated or unused outlets roaming around.

Label Outlet https://i.sstatic.net/5y7Ra.jpg

I've also made sure to set ProfileFoldingCellView.swift as the file owner's class.

Everything runs perfectly until I link the outlet! Then I get this error:

Error https://i.sstatic.net/ROcr4.jpg

Trust me, I've tried everything. I've probably re-created the outlet a million times, nothing is working. Any help would be greatly appreciated!

Upvotes: 7

Views: 3564

Answers (4)

hmali
hmali

Reputation: 429

The answer is already mentioned in the upper section. I just want to illustrate it with images so that it can be more understandable.

Step1: Do not assign the class to the file owner and leave it as NSObject enter image description here

Step2: Select your main view and Assign the class to that view enter image description here

Step3: Now connect your outletenter image description here

Now it will not cause any kind of error related to IBOutlet :)

Upvotes: 0

Yoli Meydan
Yoli Meydan

Reputation: 161

I fixed it!

I simply switched the line

let contentView = UINib(nibName: "ProfileFoldingCellView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView

with the following:

let contentView = Bundle.main.loadNibNamed("ProfileFoldingCellView", owner: self, options: nil)?[0] as! UIView

I kept the file owner's class as ProfileFoldingCellView

Upvotes: 3

janusfidel
janusfidel

Reputation: 8106

Leave your File's Owner as NSObject and set your view class as ProfileFoldingCellView, your mainLabel should be connected to the UIView object and not File's Ownerenter image description here

Upvotes: 9

Scott Thompson
Scott Thompson

Reputation: 23701

According to the image you posted, your mainLabel outlet is not connected to the label... It's connected to the files owner object which is probably your cell view and not a UILabel.

Upvotes: 1

Related Questions