Подтвердить что ты не робот

Авария приложений на устройстве - отлично работает на Simulator

Недавно я работал над приложением. Цель приложения - показать вам последние 10 фотографий, сделанных в обзоре "Сегодня" Центра уведомлений, среди прочего. Приложение отлично работает в iOS Simulator, но как только я положил его на реальное устройство для тестирования, он терпит неудачу. Он возвращает ошибку:

fatal error: Unexpected nil while unwrapping an Optional value

Обычно это очень легко исправить, поскольку XCode выделяет код, который возвращает нуль, и дает вам возможность исправить его. В этом случае ни один из моих кодов не выделяется. Вместо этого он выделяет строку из Thread 1 (это правильный термин? Thread 1?), Как показано ниже: enter image description here Также обратите внимание, что над линией с подсветкой находится строка

; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()).(closure #2)

Я включил эту строку в изображение из-за части "fatalErrorMessage". Я подозреваю, что это может привести меня к ошибке, но я понятия не имею, что это значит. Я еще не понял этого.

Кроме того, после некоторого раздумья я поставил точку останова в функции viewDidLoad() в надежде отслеживать любые значения nil, но код, похоже, никогда не доходит до этой точки. Кажется, что ни один из моих кодов не запускается.

У кого-нибудь были проблемы вроде этого/понимает, что означает этот код ошибки (если это то, что он есть)? Теперь я довольно отчаянный, поэтому я здесь.

Спасибо, CodeIt

EDIT: Я поместил строку println внутри функции viewDidLoad, чтобы проверить, выполняется ли она. Функция println запускается и выводится правильно, поэтому я думаю, что я как-то перепутал свою точку останова. В любом случае - код запускается, но он по-прежнему не выделяет ни одного из моего кода, вызывающего значение nil.

ИЗМЕНИТЬ 2: В соответствии с запросом я вставил части своего кода. Пожалуйста, имейте в виду, что этот код является "первым проектом", если хотите, и я еще не успел его очистить. Я просто пытаюсь заставить его работать:

@IBOutlet weak var currentPosLabel: UILabel!
var currentImgPos = 0
@IBOutlet weak var imageView: UIImageView!
var images: NSMutableArray!
var totalImageCountNeeded: Int!

func fetchPhotos() {
    images = NSMutableArray()
    totalImageCountNeeded = 10
    self.fetchPhotoAtIndexFromEnd(0)
}


func fetchPhotoAtIndexFromEnd(index: Int) {
    let imgManager = PHImageManager.defaultManager()

    var requestOptions = PHImageRequestOptions()
    requestOptions.synchronous = true

    var fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) {
        if fetchResult.count > 0 {
            imgManager.requestImageForAsset(fetchResult.objectAtIndex(fetchResult.count - 1 - index) as? PHAsset, targetSize: view.frame.size, contentMode: PHImageContentMode.AspectFill, options: requestOptions, resultHandler: { (image, _) in
                self.images.addObject(image)
                if index + 1 < fetchResult.count && self.images.count < self.totalImageCountNeeded {
                    self.fetchPhotoAtIndexFromEnd(index + 1)
                } else {
                    println("Completed array: \(self.images)")
                }



            })
        }
    }

}







override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(animated: Bool) {
    // NOTE: I am calling the fetchPhotos() function here since earlier in my debugging I thought the problem may be that I was calling it too early in the viewDidLoad function. It an incorrect theory, but it was worth a try.
    fetchPhotos()
    if images.count > 0 {
        imageView.image = images[1] as? UIImage
    }
}

Я удалил некоторые части кода, которые, как я знаю, не имеют причин вызывать мою ошибку, например @IBActions, didReceiveMemoryWarning() и т.д.

4b9b3361

Ответ 1

Даже старый вопрос. Я нашел свою проблему, удалив полученные данные из xcode.

Xcode → window- > Проекты, затем выберите и удалите полученные производные данные.

Ответ 2

Я не думаю, что можно точно определить, где проблема, не видя ваш код.

Где-то в вашем коде вы можете заставить downcast переменную as!. Если вы измените это на:

if let variable = optionalVariable as? SomeClass {
    //Insert your code
}

Тогда это должно исправить вашу проблему. Прочтите это, чтобы узнать больше о литье в быстром режиме:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html

Ответ 3

Вы должны запустить одно и то же устройство на симуляторе и реальном устройстве. В качестве примера, если вы запускаете 5s на реальном устройстве, попробуйте одно и то же устройство на симуляторе. При запуске симулятора он обязательно покажет ошибку. Моя ошибка была не подключение @IBActions. Надеюсь, что этот совет поможет вам.

Ответ 4

Я получил ту же ошибку при попытке установить необязательное значение для значения неявно-развернутого необязательного значения, которое было nil.

Ex. someGlobalFunction() возвращает ImplicitlyUnwrappedOptional с нулевым значением, затем вы пытаетесь установить его на регулярное значение.

func someGlobalFunction() -> String! { return nil }

class MyClass {
    let aVariable: String

    init() {
        aVariable = someGlobalFunction()
    }
}