2017-04-21 3 views
0

Ich versuche, meine CustomView, die in meinem HomeViewcontroller in Interface Builder verknüpft ist. Hier ein Screenshot des Storyboards: IBLoad Benutzerdefinierte UIView in ScrollView

Alle Ausgänge sind mit CarouselView IBOutlets verbunden.

Hier ist die UIView-Datei (Karussell-Ansicht in SCREENSHOT von Interface Builder):

CarouselScrollView.swift

import UIKit 

class CarouselView: UIView { 
@IBOutlet weak var assignmentStatusLabel: UILabel! 
@IBOutlet weak var assignmentCustomerLabel: UILabel! 
@IBOutlet weak var assignmentAgencyLabel: UILabel! 
@IBOutlet weak var assignmentPeriodLabel: UILabel! 
@IBOutlet weak var nextAssignmentButton: UIButton! 
@IBOutlet weak var previousAssignmentButton: UIButton! 

init(frame: CGRect, _ status: String, _ customer: String, _ agency: String, _ period: String) { 
    super.init(frame: frame) 
    self.setupView("status", "customer", "agency", "period") 
} 

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

func setupView(_ status: String, _ customer: String, _ agency: String, _ period: String) { 
    //  self.assignmentStatusLabel.text = status 
    //  self.assignmentCustomerLabel.text = customer 
    //  self.assignmentAgencyLabel.text = agency 
    //  self.assignmentPeriodLabel.text = period 
}} 

Hier meine Viewcontroller, wo ich meine scroll mit 3 CarouselView füllen:

import UIKit 
class HomeViewController: BaseViewController, HomeView { 

@IBOutlet weak var carouselScrollView: UIScrollView! 
@IBOutlet weak var carouselView: CarouselView! 

var presenter: HomePresenter? 
var currentAssignmentView: Int = 0 
// create array of assignments for test 
let arrayOfAssignments = [["status":"Mission en cours", "customer":"customer1", "agency":"bourg", "startDate":"09-05-2016", "endDate":"10-05-2016"], 
          ["status":"Mission à venir", "customer":"customer2", "agency":"agency paris", "startDate":"09-01-2017", "endDate":"03-04-2017"], 
          ["status":"Mission passée", "customer":"customer3", "agency":"agency lyon", "startDate":"09-09-2017", "endDate":"29-05-2018"] 
] 

override func initPresenter() -> BasePresenter { 
    let presenter = HomePresenter(self, Navigator(self)) 
    self.presenter = presenter 
    return presenter 
} 

override func setup() { 
    self.navBarTitleImageSetup() 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
     self.scrollViewSetup() 
} 

func scrollViewSetup() { 
    let carouselScrollViewWidth:CGFloat = self.carouselScrollView.frame.width 
    let carouselScrollViewHeight:CGFloat = self.carouselScrollView.frame.height 
    let numberOfAssignments = self.arrayOfAssignments.count 

    self.carouselScrollView.contentSize = CGSize(width: carouselScrollViewWidth * CGFloat(numberOfAssignments), height: carouselScrollViewHeight) 
    for i in 0...numberOfAssignments - 1 { 
     let carouselView = CarouselView(frame: CGRect(x: carouselScrollViewWidth * CGFloat(i), y: CGFloat(0), width: carouselScrollViewWidth, height: carouselScrollViewHeight), "iuhiuh", "oiojoij", "iuhiuh", "iuhiuhiuh") 
     switch i { 
     case 0: 
      carouselView.backgroundColor = UIColor.blue 
     case 1: 
      carouselView.backgroundColor = UIColor.yellow 
     case 2: 
      carouselView.backgroundColor = UIColor.gray 
     default: 
      break 
     } 
     self.carouselScrollView.addSubview(carouselView) 
    } 
    self.carouselScrollView.delegate = self 
} 

func navBarTitleImageSetup() { 
    let image: UIImage = #imageLiteral(resourceName: "NavLogo") 
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 97, height: 24)) 
    imageView.contentMode = .scaleAspectFit 
    imageView.image = image 
    self.navigationItem.titleView = imageView 
}} 

extension HomeViewController: UIScrollViewDelegate { 
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    let viewWidth: CGFloat = self.carouselScrollView.frame.width 
    let currentAssignmentNumber: CGFloat = floor((self.carouselScrollView.contentOffset.x - viewWidth/2)/viewWidth)+1 
    self.currentAssignmentView = Int(currentAssignmentNumber) 
}} 

Wenn ich Build & Lauf so kann ich meine Scroll-Ansicht scrollen (3 vi ews hinzugefügt wurde), aber es gibt kein Label (normal, weil kommentiert):

scroll1 scroll2

Aber wenn ich eine dieser Linien in meiner CarouselScrollView.swift Datei Kommentar-:

//  self.assignmentStatusLabel.text = status 
    //  self.assignmentCustomerLabel.text = customer 
    //  self.assignmentAgencyLabel.text = agency 
    //  self.assignmentPeriodLabel.text = period 

Ich habe Dieser Fehler in der Konsole:

fatal error: unexpectedly found nil while unwrapping an Optional value

Ich verstehe nicht, warum mein Etikettist 210. Alles scheint in Ordnung zu sein. Jemand hat die Lösung oder eine Idee ?. Vielen Dank für Ihre Zeit und Ihre Hilfe.

+0

Überprüfen Sie, ob die Etiketten ordnungsgemäß mit den Steckdosen in Interface Builder verbunden sind. –

+0

Vielen Dank, aber schon einige Male gemacht und das Problem ist nicht das. –

+0

Vielleicht verwenden Sie die Bezeichnungen, bevor 'watchFromNib' aufgerufen wird. –

Antwort

0

Das Problem wird gelöst, wenn Sie setupView aufrufen, nachdem die als Unteransicht hinzugefügt wurde, weil erst nach dem Hinzufügen als Unteransicht Ihre Etiketten initialisiert werden.

+0

Wie kann ich das tun, ohne 2 Schleifen statt einer machen? Als Sie user3057272 –

+1

Wenn Sie über 'for' Schleife sprechen, dann sollten Sie eine Eigenschaft erstellen, die es möglicherweise in 'SetupView' verfolgt –

0

Wie gesagt, Paramasivan Samuttiram Ich musste meine customView in separaten Nib (. Xib) -Datei erstellen. Ich hatte gehofft, dass es eine andere Lösung geben würde, um das customView in meinem Storyboard zu behalten (um es direkt über meinem HomeController zu halten), aber das hat den Trick gemacht.

In CarouselView habe ich dies:

class func instanceFromNib() -> UIView { return UINib(nibName: "CarouselView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView } 

jetzt CarouselView Datei wie folgt aussieht:

class CarouselView: UIView { 
@IBOutlet weak var assignmentStatusLabel: UILabel! 
@IBOutlet weak var assignmentCustomerLabel: UILabel! 
@IBOutlet weak var assignmentAgencyLabel: UILabel! 
@IBOutlet weak var assignmentPeriodLabel: UILabel! 
@IBOutlet weak var nextAssignmentButton: UIButton! 
@IBOutlet weak var previousAssignmentButton: UIButton! 

class func instanceFromNib() -> UIView { 
    return UINib(nibName: "CarouselView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView 
} 

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

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

Und in HomeViewController ich instanziiert meine 3 benutzerdefinierte Ansichten wie die in meiner Schleife in func scrollViewSetup:

func scrollViewSetup() { 
    let carouselScrollViewWidth:CGFloat = self.carouselScrollView.frame.width 
    let carouselScrollViewHeight:CGFloat = self.carouselScrollView.frame.height 
    let numberOfAssignments = self.arrayOfAssignments.count 

    self.carouselScrollView.contentSize = CGSize(width: carouselScrollViewWidth * CGFloat(numberOfAssignments), height: carouselScrollViewHeight) 
    for i in 0...numberOfAssignments - 1 { 
     let carouselView = CarouselView.instanceFromNib() as! CarouselView 
     carouselView.frame = CGRect(x: carouselScrollViewWidth * CGFloat(i), y: CGFloat(0), width: carouselScrollViewWidth, height: carouselScrollViewHeight) 
     carouselView.assignmentStatusLabel.text = self.arrayOfAssignments[i]["status"] 
     carouselView.assignmentCustomerLabel.text = self.arrayOfAssignments[i]["customer"]?.uppercased() 
     carouselView.assignmentAgencyLabel.text = self.arrayOfAssignments[i]["agency"]?.uppercased() 
     carouselView.assignmentPeriodLabel.text = "\(self.arrayOfAssignments[i]["startDate"]!) - \(self.arrayOfAssignments[i]["endDate"]!)" 
     self.carouselScrollView.addSubview(carouselView) 
    } 
    self.carouselScrollView.delegate = self 
} 

Alle arbeiten jetzt korrekt.

Vielen Dank an alle,

Verwandte Themen