2015-09-19 2 views
0

В моем приложении я создаю постраничный слайдер (UISlider + UIPageControl). Приложение обращается к CoreData, чтобы получить массив Entities для создания «страницы».Создание и настройка заголовка UIButton в цикле прерываний цикла FOR

Я строю постраничного скроллер н следующий цикл:

for i in 0..<features.count { 
     var pageWidth = Int(view.frame.width)*i 
     var pageView = UIView(frame: CGRectMake(CGFloat(pageWidth), 0, scrollView.frame.width, scrollView.frame.height)) 
     pageView.backgroundColor = UIColor.clearColor() 
     pageView.clipsToBounds = true 

     //Background image 
     var imageView = UIImageView(frame: CGRectMake(0, 0, scrollView.frame.width, scrollView.frame.height)) 
     var image:UIImage! 
     imageView.contentMode = .ScaleAspectFill 
     pageView.addSubview(imageView) 

     if fileManager.fileExistsAtPath(features[i].coverImage){ 
      //The background image 
      image = UIImage(contentsOfFile: self.features[i].coverImage) 
      imageView.image = image 
     } 
     else if !fileManager.fileExistsAtPath(features[i].coverImage) && !features[i].coverImage.isEmpty { 
      FileStoreClient.downloadFileIfNotExists(features[i].cover, completion: { (success, error) -> Void in 
       if error == nil { 
        image = UIImage(contentsOfFile: self.features[i].coverImage) 
        imageView.image = image 
       } 
       else { 
        println("There was an error during the download") 
       } 
      }) 
     } 

     //The background cover 
     var coverView = UIView(frame: CGRectMake(0, 0, view.frame.width, 250)) 
     coverView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6) 
     pageView.addSubview(coverView) 

     //The title 
     var titleLabel = UILabel(frame: CGRectMake(10, 40, view.frame.width-20, 25)) 
     titleLabel.font = UIFont(name: "Haymaker", size: 24) 
     titleLabel.textColor = UIColor.whiteColor() 
     titleLabel.layer.shadowColor = UIColor.blackColor().CGColor 
     titleLabel.layer.shadowOffset = CGSizeMake(1, 1) 
     titleLabel.layer.shadowRadius = 1 
     titleLabel.layer.shadowOpacity = 1 
     titleLabel.textAlignment = .Center 
     titleLabel.text = features[i].title 
     pageView.addSubview(titleLabel) 

     //The text 
     var textLabel = UILabel(frame: CGRectMake(10, titleLabel.frame.origin.y+titleLabel.frame.height+5, view.frame.width-20, 60)) 
     textLabel.numberOfLines = 0 
     textLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping 
     textLabel.font = UIFont(name: "OpenSans", size: 13) 
     textLabel.textColor = UIColor.whiteColor() 
     textLabel.textAlignment = .Center 
     textLabel.text = features[i].summary 
     pageView.addSubview(textLabel) 

     //The button 
     var readMoreButton = UIButton(frame: CGRectMake(0, pageView.frame.height - 90, 200, 80)) 
     readMoreButton.setAttributedTitle(NSAttributedString(string: Strings.readMoreButtonTitle, attributes: Fonts.featureButtonText), forState: UIControlState.Normal) 
     //readMoreButton.addTarget(self, action: "readArticle", forControlEvents: .TouchUpInside) 
     readMoreButton.layer.cornerRadius = 6 
     readMoreButton.layer.borderColor = UIColor.whiteColor().CGColor 
     readMoreButton.layer.borderWidth = 1 
     readMoreButton.center.x = pageView.center.x 
     pageView.addSubview(readMoreButton) 

     println(i) 

     scrollView.addSubview(pageView) 
} 

Все работает точно так, как и должно быть, за исключением того, что в тот момент я пытаюсь присвоить заголовок новой кнопки, цикл превращается в бесконечный цикл , Если я распечатаю текущий индекс цикла, он продолжает бесконечно циклически перемещаться. Пример:

0 
1 
2 
0 
1 
2 
0 
1 
2 

Если я закомментировать метод myButton.setTitle(), проблема уходит и индексы распечатайте, как в следующем:

0 
1 
2 

Я попытался SETTITLE и setAttributedTitle, оба из которых имеют тот же эффект. Я попытался отправить разные очереди и ничего не работает.

Снова все работает для фонового изображения, двух меток, представлений и т. Д. Проблема существует только при вводе кнопки в микс. Проблема существует, даже если я удалю код FileStoreManager.

Что-то про кнопку в цикле for не устраивает.


EDIT # 1

Я решил попробовать создать новый проект, просто чтобы проверить создание кнопки в цикле. Это прекрасно работает.

var x = 20 
var y = 20 

override func viewDidLoad() { 
    super.viewDidLoad() 

    for i in 1...10 { 
     var myview = UIView(frame: CGRectMake(CGFloat(x), CGFloat(y), 100, 50)) 
     var button = UIButton(frame: CGRectMake(0, 0, 100, 50)) 
     button.setTitle("Test", forState: .Normal) 
     button.setTitleColor(UIColor.blackColor(), forState: .Normal) 
     button.layer.borderColor = UIColor.blackColor().CGColor 
     button.layer.borderWidth = 2 
     myview.addSubview(button) 
     view.addSubview(myview) 
     x = x+20 
     y = y+20 
     println(i) 
    }  
} 

ответ

0

Вы также можете попробовать быструю перепись в случае, если что-то каким-то образом запуталось в вашем диапазоне.

for feature in features { ... } 

или если вам нужен индекс:

for (index, features) in features.enumerate() { ... } 

Не уверен, что он будет решать эту проблему, но это может повысить читаемость.

+0

Благодарим за понимание читаемости. Я понял проблему, но также выполнил ваше предложение, чтобы сохранить его разборчивым. – matcartmill

0

Получается, потому что у меня был код выше в функции viewDidLayoutSubviews(). Кажется, что-то о настройке названия кнопок вызывает метод.

Поскольку мне нужно было использовать этот метод из-за динамических размеров, я просто добавил «hasLoaded: Bool», чтобы проверить, была ли эта функция уже запущена.

Это решило проблему.

Смежные вопросы