2017-04-21 55 views
0

我尝试添加我的自定义视图,该视图在Interface Builder中的HomeViewcontroller中链接。这里有一个故事板的截图: IB在ScrollView中加载自定义UIView

所有插座都链接到CarouselView IBOutlets

这里UIView的文件(木马查看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 
}} 

这里我的ViewController,我填补我的滚动视图3轮播画面:

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) 
}} 

当我建立&像这样运行我可以滚动我的滚动视图(3 vi加入EWS),但没有标签(正常的,因为评论):

scroll1 scroll2

但是,当我取消这些线路之一在我CarouselScrollView.swift文件:

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

我有这个错误在控制台:

fatal error: unexpectedly found nil while unwrapping an Optional value

我不明白为什么我的标签是nil。一切似乎都好。有人有解决方案或想法?提前感谢您的时间和您的帮助。

+0

检查标签是否正确连接到Interface Builder中的插座。 –

+0

谢谢,但已经做了几次,问题不是这样。 –

+0

也许你在'awakeFromNib'被调用之前使用了标签。 –

回答

0

如果您在carouselView作为子视图添加后调用setupView,则问题将得到解决,因为只有在添加子视图之后,您的标签才会被初始化。

+0

我怎么能做到这一点,而不是让2循环而不是一个? 比你user3057272 –

+1

如果你在谈论'for'循环,那么你应该创建一个属性来跟踪它可能在'setupView' –

0

像说的Paramasivan Samuttiram我不得不在独立的Nib(.xib)文件中创建我的customView。我希望能有另一种解决方案,以便能够将自定义视图保留在我的故事板内(保持在我的HomeController之上),但这确实有效。

在轮播画面我添加了这个:

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

现在轮播画面文件是这样的:

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) 
}} 

而在HomeViewController我实例一样,我的3个自定义视图在我的循环在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 
} 

现在所有工作都正常。

谢谢大家,