Раскрытие подробностей, загруженное поверх предыдущего раскрытия подробностей

У меня есть вид карты с аннотациями, и у каждой аннотации есть соответствующая дата с днем, месяцем и временем.

Я нажимаю день на новый контроллер представления, а затем с помощью switch чтобы увидеть, в какой день месяца он выпадает, а затем отобразить соответствующий значок календаря. Я не могу поставить func где-нибудь, кроме viewDidAppear, который вызывает короткую задержку и два, мешает мне использовать

for view in self.view.subviews {
    view.removeFromSuperview()
}

Итак, два вопроса:

  • Как я могу вызвать функцию dayCalendar перед viewDidAppear (где-либо еще я пытался поставить код, он возвращает ноль)
  • как я могу предотвратить появление моих подробных раскрытий друг на друге?

Это код, отвечающий за показ изображения:

override func viewDidAppear(animated: Bool) {
    dayCalendar()
}

func dayCalendar() {

    switch day {
    case 1:
        let calendarDay = "Calendar 1-50.png"
        let calendarDayImage = UIImage(named: calendarDay)
        let calendarDayImageView = UIImageView(image: calendarDayImage!)
        calendarDayImageView.frame = CGRect(x: 25 , y: 350, width: 50, height: 50)
        self.view.addSubview(calendarDayImageView)
    case 8:
        let calendarDay = "Calendar 8-50.png"
        let calendarDayImage = UIImage(named: calendarDay)
        let calendarDayImageView = UIImageView(image: calendarDayImage!)
        calendarDayImageView.frame = CGRect(x: 25 , y: 350, width: 50, height: 50)
        self.view.addSubview(calendarDayImageView)
    case 11:
        let calendarDay = "Calendar 11-50.png"
        let calendarDayImage = UIImage(named: calendarDay)
        let calendarDayImageView = UIImageView(image: calendarDayImage!)
        calendarDayImageView.frame = CGRect(x: 25 , y: 350, width: 50, height: 50)
        self.view.addSubview(calendarDayImageView)

    case 12:
        blahh blahh blahh all the way down

    case 31:
        let calendarDay = "Calendar 30-50.png"
        let calendarDayImage = UIImage(named: calendarDay)
        let calendarDayImageView = UIImageView(image: calendarDayImage!)
        calendarDayImageView.frame = CGRect(x: 25 , y: 350, width: 50, height: 50)
        self.view.addSubview(calendarDayImageView)
    default:
        println("Default")
        break
    }

}

1 ответ

Решение

Прежде всего: почему вы на самом деле переключаетесь? Насколько я могу сказать, код может быть уменьшен до

func dayCalendar() {
    if day < 1 || day > 31 {
        return 
    }
    let calendarDay = "Calendar \(day)-50.png"
    let calendarDayImage = UIImage(named: calendarDay)
    let calendarDayImageView = UIImageView(image: calendarDayImage!)
    calendarDayImageView.frame = CGRect(x: 25 , y: 350, width: 50, height: 50)
    self.view.addSubview(calendarDayImageView)
}

Вы можете переместить вызов на viewWillAppear,

Чтобы исправить наложение закрытий деталей, у вас есть два варианта:

  • удалить добавленное calendarDayImageView каждый раз, когда вы отображаете новый день.

или (намного лучше)

  • повторно использовать уже добавленное представление изображения, если оно уже присутствует (возможно, потребуется создать переменную lazy) и просто изменить отображаемое изображение.

Последнего вы можете достичь следующим образом:

// add this variable to your class
lazy var calendarDayImageView: UIImageView = {
    [unowned self] in
    let imageV = UIImageView(frame: CGRect(x: 25 , y: 350, width: 50, height: 50))
    self.view.addSubview(imageV)
    return imageV
}()

// change the dayCalender to make use of the newly added variable
func dayCalendar() {
    if day < 1 || day > 31 {
        return 
    }
    let calendarDay = "Calendar \(day)-50.png"
    let calendarDayImage = UIImage(named: calendarDay)
    calendarDayImageView.image = calendarDayImage
}

В качестве альтернативы вы можете просто переместить инициализацию представления внутри viewDidLoad и иметь dayCalender снова только установить фактическое изображение - но я люблю ленивые переменные;)

Другие вопросы по тегам