6

I'm receiving this error on a file which works previously on all other beta's, for some reason in the beta 4 xcode it displays this error, its the only file in the entire project which does it and i'm not sure why its doing it just for beta 4, any ideas? i've tried using the default init on it but i get a compile error.

i think theres too much code to place in, so instead heres the file direct.

https://www.dropbox.com/s/7a6q1oyj2qnshu0/SearchView.swift

import UIKit
import CloudKit
import Foundation
import QuartzCore
import MediaPlayer
import AVFoundation
import CoreMedia

class SearchViewController: UIViewController, UITableViewDelegate,UITableViewDataSource, UISearchBarDelegate, UIScrollViewDelegate, SearchAPIProtocol {



enum UIUserInterfaceIdiom : Int {
    case Unspecified

    case Phone // iPhone and iPod touch style UI
    case Pad // iPad style UI
}


var searchCell: SearchViewCell = SearchViewCell()
var progressView: CGCircleProgressView = CGCircleProgressView()
var tableData = NSArray()
var buttonIndex: NSIndexPath?
var previousIndex: NSIndexPath?
var songPlayer = AVPlayer()
var hidden = Bool()
var startContentOffset = CGFloat()
var lastContentOffset = CGFloat()
var firstAmount = Int()
var imageCache = NSMutableDictionary()
var searchOpen: Bool?
var searchAPI: SearchAPIController = SearchAPIController()
@IBOutlet var tableView: UITableView!
@IBOutlet var searchBar: UISearchBar!

@IBOutlet var sBar: UIView!

override func viewDidLoad() {
        super.viewDidLoad()

    var nib = UINib(nibName: "SearchViewCell", bundle: nil)

    tableView.registerNib(nib, forCellReuseIdentifier: "Cell")
     searchAPI.delegate = self
    searchAPI.searchItunesFor("Justin")
   // container = CKContainer.defaultContainer()
    //publicDatabase = container?.privateCloudDatabase
    self.setUpSearchBar()
   hidden = false
    self.tableView.contentInset = UIEdgeInsetsMake(108, 0, 0, 0)
    var subViews: UIView = searchBar.subviews.bridgeToObjectiveC().lastObject as UIView
    var textView: UITextField = subViews.subviews.bridgeToObjectiveC().objectAtIndex(1) as UITextField
    textView.textColor = UIColor.whiteColor()
    // Do any additional setup after loading the view, typically from a nib.

}





func setUpSearchBar() {

        var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Dark)) as UIVisualEffectView

        visualEffectView.frame = sBar.bounds

        sBar.addSubview(visualEffectView)
        sBar.sendSubviewToBack(visualEffectView)

        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.CenterX,
            relatedBy:.Equal, toItem:sBar,
            attribute:.CenterX, multiplier:1, constant:0))
        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.CenterY,
            relatedBy:.Equal, toItem:sBar,
            attribute:.CenterY, multiplier:1, constant:0))

        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Width,
            relatedBy:.Equal, toItem:sBar,
            attribute:.Width, multiplier:1, constant:0))

        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Height,
            relatedBy:.Equal, toItem:sBar,
            attribute:.Height, multiplier:1, constant:0))

        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Leading,
            relatedBy:.Equal, toItem:sBar,
            attribute:.Leading, multiplier:1, constant:0))

        sBar.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Trailing,
            relatedBy:.Equal, toItem:sBar,
            attribute:.Trailing, multiplier:1, constant:0))


        visualEffectView.setTranslatesAutoresizingMaskIntoConstraints(false)
    }


 override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

and displaying tableview:

func tableView(tableView: UITableView!, heightForHeaderInSection section: Int) -> Int {
    return 1
}
func tableView(tableView: UITableView!, viewForFooterInSection section: Int) -> UIView {
    var view = UIView(frame: CGRect.zeroRect)
    return view
}
func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    return 81
}

func tableView(tableView: UITableView!, heightForFootInSection section: Int) -> Int {
        return 1
}

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {

    if self.tableData.count > firstAmount {
        return firstAmount + 1
    } else {
        return 0
    }
        //return self.tableData!.count


}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
    let CellIndentifier: NSString = "Cell"
    let moreID: String = "moreCell"

    var searchCell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as SearchViewCell


    var rowData: NSDictionary = self.tableData[indexPath!.row] as NSDictionary
    var rows = indexPath.row

    if rows == firstAmount {

        searchCell.loadMoreView.hidden = false

    } else {
    searchCell.selectionStyle = UITableViewCellSelectionStyle.None
    searchCell.clipsToBounds = true

        searchCell.loadMoreView.hidden = true

    var artistName = rowData["artistName"] as String
    var trackName = rowData["trackName"] as String
    var previewURL = rowData["previewUrl"] as String
    //var artistURL = rowData["artistViewUrl"] as String
    //var buyURL = rowData["trackViewUrl"] as String
    var artworkURL = rowData["artworkUrl100"] as String


    searchCell.previewButton.addTarget(self, action: "flipButton:", forControlEvents: UIControlEvents.TouchUpInside)


    searchCell.songName.text = trackName
    searchCell.artistName.text = artistName

    var layer: CALayer = searchCell.blurView.layer
    layer.shadowOffset = CGSizeMake(0, 0)
    layer.shadowColor = UIColor(white: 0.0, alpha: 1.0).CGColor
    layer.shadowRadius = 1.0
    layer.shadowOpacity = 0.5

    searchCell.backImage.clipsToBounds = true
    var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Dark)) as UIVisualEffectView


    visualEffectView.frame = searchCell.blurView.bounds

    searchCell.blurView.addSubview(visualEffectView)
    searchCell.blurView.sendSubviewToBack(visualEffectView)


       // NSLayoutConstraint.deactivateConstraints(searchCell.blurView.constraints())
        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.CenterX,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.CenterX, multiplier:1, constant:0))
        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.CenterY,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.CenterY, multiplier:1, constant:0))

        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Width,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.Width, multiplier:1, constant:0))

        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Height,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.Height, multiplier:1, constant:0))

        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Leading,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.Leading, multiplier:1, constant:0))

        searchCell.blurView.addConstraint(NSLayoutConstraint(
            item:visualEffectView, attribute:.Trailing,
            relatedBy:.Equal, toItem:searchCell.blurView,
            attribute:.Trailing, multiplier:1, constant:0))


        visualEffectView.setTranslatesAutoresizingMaskIntoConstraints(false)




    var placeHolder = UIImage(named: "placeHolder.png")
    searchCell.artworkIMG.image = placeHolder
    searchCell.backImage.image = placeHolder

        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

            var urlString: NSString = rowData["artworkUrl100"] as NSString

            var image: UIImage? = self.imageCache.valueForKey(urlString) as? UIImage

            if( !image? ) {
                var imgURL: NSURL = NSURL(string: urlString)

                var request: NSURLRequest = NSURLRequest(URL: imgURL)
                var urlConnection: NSURLConnection = NSURLConnection(request: request, delegate: self)

                NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
                    if !error? {
                        image = UIImage(data: data)
                        self.imageCache.setValue(image, forKey: urlString)
                        searchCell.artworkIMG.image = image
                        searchCell.backImage.image = image
                    } else {
                        println("Error: \(error.localizedDescription)")
                    }
                    })

            } else {

                searchCell.artworkIMG.image = image
                searchCell.backImage.image = image
            }
            })

    }
    return searchCell
}
func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
    cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1)
    /*UIView.animateWithDuration(0.25, animations: {
        cell.layer.transform = CATransform3DMakeScale(1,1,1)
        })*/
    UIView.animateWithDuration(0.4, animations: {
        cell.layer.transform = CATransform3DMakeScale(1.1,1.1,1.1)
        }, completion: {(value: Bool) in
        cell.layer.transform = CATransform3DMakeScale(1,1,1)
        })
}
3
  • its a lot of code? would it be better to link to a file? Commented Jul 23, 2014 at 3:16
  • 1
    You can show the relevant parts without showing all of it. For example, show your class and at least the first line of its initializers... Commented Jul 23, 2014 at 3:24
  • code has been added @jtbandes Commented Jul 23, 2014 at 6:16

6 Answers 6

10

From SwiftSoda.com:

Many Swift Programmers are having a little trouble with ViewControllers and Xcode beta 4. The error is viewController is not constructible with ().

But if you look at your View Controller, you will see another error, Class viewController has no initializers. Followed by (replace with whichever outlets you are using) NSTextField has non-optional type ‘NSTextField’.

Setting the IBOutlets with ? the end corrects the problem. After that you will need to change some syntax each time the Outlet’s variable is used with !.

Here is a brief example:

//ViewController Class File:
// view controller swift file for OS X
import AppKit

// you can use () for AnyObject as long as you do some things first.
var mvc = vc()

class vc: NSViewController {
// the key here is "?" after NSTextField to declare an optional
@IBOutlet var myStatusField: NSTextField?
}

//AppDelegate File:
import AppKit

//here we load the view inside the AppDelegate
class AppDelegate: NSObject, NSApplicationDelegate {

@IBOutlet var window: NSWindow!

func applicationDidFinishLaunching(aNotification: NSNotification?) {
// Insert code here to initialize your application

//load and center view in main window
window.contentView.addSubview(mvc.view)
mvc.view.frame = window.contentView.bounds

//here we display some text in myStatusField with *!.stringValue
// ! is used to unwrap the optional.
mvc.myStatusField!.stringValue = "Swift Soda wishes you a good day!"
}
}
Sign up to request clarification or add additional context in comments.

2 Comments

That worked! now i've come across another problem, i'll open up another thread. Thanks!
Using an exclamation mark instead of a question mark worked for me.
6

Had the same error because one of my properties was not initialized. Hope it helps some peoples

2 Comments

One of my properties in my viewcontroller was not initialized. I set this property to a default value and the error disappear. It seems that non-initialized variable should be initialized or you should specify they are non-mandatory with the ? character
This worked for me. I had a property that was not initialized so I set the variable as optional (?) and it worked.
3

I believe the easiest way is just override an init function without override keyword and just call super.init, and it works like this

@IBOutlet weak var tableView: UITableView!

init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

}

Comments

0

you may want to safely unwrap any optionals with an if IBOutletName Statement like this:

if mvc.myStatusField {
mvc.myStatusField!.stringValue = "Swift Soda wishes you a good day!"
}

That way your app will not crash.

I'm trying to get IBOutlets to work without using ? and ! (optionals), but so far it seems to be the only thing that works in beta4 with a NSViewController.

Comments

0

Implement the below in your view controller:

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

Comments

0

I got this error because I declared constant optional, you can see code below :

let subCategory: String?

I changed form let to var and problem solved for me. Using Xcode 10, Swift 4.2

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.