2015-01-09 2 views
0

В настоящее время у меня есть UITableView, который содержит список событий. Каждое событие имеет кнопку, где пользователь может нажать ее, чтобы получить доступ к большему представлению фотографии, связанной с событием. У меня подключен и настроен UIButton, но мне сложно настроить изображение в новом окне. Вот моя функция:Установить изображение UIImageView

func largeMap(sender: UIButton!) { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
    let manager = NSFileManager.defaultManager() 
    self.performSegueWithIdentifier("largeMapView", sender: self) 
    println(sender.tag.description) 
    println(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") 
    if let image = UIImage(data: manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png")!) { 
     largeMapView.image = image 
    } 
} 

Когда я запустить приложение, он выходит из строя при largeMapView.image = изображение и дает мне «неустранимая ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение». Я проверил, и путь к изображению правильный, и он обращается к изображению, но он не может установить его в UIImageView. У меня есть выход UIImageView, расположенный в верхней части класса. Почему это происходит? Я уже установил UIImageView таким образом, но теперь это просто не сработает.

ответ

1

В основном проблема заключается в том, что вы используете восклицательные знаки. Восклицательные знаки никогда не будут безопасными! Они могут быть «неприятным запахом», сигналом опасности - и в вашем коде это именно то, что они есть.

(1)

I have the UIImageView outlet set at the top of the class.

Но вы не показывают как она установлена. Вы не показываете, что такое largeMapView или как оно объявлено. Заявление может выглядеть следующим образом:

@IBOutlet var largeMapView : UIImageView! 

Если это так, что это плохо - то есть неявно развернутый необязательны, что означает, что может быть равна нулю. Это может быть источником вашей проблемы. Используя условно развернутую опцию, вы скрываете проблему - пока вы не попытаетесь установить нуль, а затем вы потерпите крах. Если он никогда не устанавливается должным образом, это является причиной аварии.

(2)

В том же же линии, остальная часть кода, тоже не следует насильно UnWrap OPTIONALS (с помощью оператора ! постфикса), если вы не знаете, для определенного, что они никогда не могут быть нулевыми , Перепишите, как это так, что каждый опционально разворачивал условно и безопасно:

if let d = manager.contentsAtPath(documentsPath+"/Flight"+(sender.tag.description)+"/Map.png") { 
    if let image = UIImage(data: d) { 
     largeMapView.image = image 
    } 
} 

Таким образом, если contentsAtPath выходит из строя или UIImage(data:) выходит из строя, то ничего не произойдет - вы не будете установить изображение - но, по крайней мере, вы не врезаться , И вы можете использовать степпинг в отладчике, чтобы выяснить, где вы находитесь : сбой. - Но даже это не спасет вас, если проблема в том, что largeMapView - это ниль, неявно развернутая Необязательно.

+0

Я реализую безопасную развертку, как вы предлагали. После запуска приложения он безопасно распаковывает изображение, но все равно доходит до конца и падает на «largeMapView.image = image», и говорит, что неожиданно нашел нуль при разворачивании опционального, что заставляет меня задавать вопрос о выходе, который я сделал. – user3185748

+0

Исправить. Вот почему я спрашиваю о выходе. Я считаю, что ваш крах является чисто диагностическим; ваша проблема _real_ заключается в том, что ваш выход не установлен. Но это будет другая проблема! Я верю, что ответил на вопрос, который вы на самом деле поставили, а именно, почему вы рушитесь в первую очередь. – matt

+0

Я ценю помощь, но мне придется продолжать работать, пока я не исправлю проблему. Если у вас есть мысли, если они будут рады их услышать! – user3185748

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