Gần đây, tôi đã làm việc trên một ứng dụng. Mục tiêu của ứng dụng là hiển thị cho bạn 10 ảnh cuối cùng được chụp trong chế độ xem Hôm nay của Trung tâm thông báo, trong số những thứ khác. Ứng dụng hoạt động hoàn hảo trong Trình mô phỏng iOS, nhưng ngay sau khi tôi đặt nó trên một thiết bị thực để thử nghiệm, nó không thành công. Nó trả về lỗi:Sự cố ứng dụng trên thiết bị - hoạt động hoàn hảo trên Simulator
fatal error: Unexpected nil while unwrapping an Optional value
Thông thường việc này rất dễ sửa vì XCode làm nổi bật mã trả về 0 và cho bạn cơ hội sửa lỗi. Trong trường hợp này, không có mã nào của tôi được đánh dấu. Thay vào đó, nó làm nổi bật một dòng từ chủ đề 1 (Đây có phải là thuật ngữ chính xác Chủ đề 1?), Như bên dưới: Cũng lưu ý rằng trên đường highlited là dòng
; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) ->()).(closure #2)
tôi bao gồm dòng này trong hình ảnh vì phần "fatalErrorMessage" của nó. Tôi nghi ngờ điều này có thể dẫn tôi vào lỗi, nhưng tôi không biết ý nghĩa của nó là gì. Tôi chưa đến mức hiểu được điều đó.
Ngoài ra, sau một vài suy nghĩ, tôi đã đặt điểm ngắt tại hàm viewDidLoad() với hy vọng theo dõi bất kỳ giá trị nil nào, nhưng mã dường như chưa bao giờ đến được điểm này. Có vẻ như không có mã nào của tôi đang được chạy.
Có ai có vấn đề như thế này/hiểu mã lỗi đó (Nếu đó là ý nghĩa của nó) nghĩa là gì? Bây giờ tôi đang tuyệt vọng, vì thế tôi đang ở đây.
Cảm ơn, CodeIt
EDIT: tôi đặt một dòng println bên trong hàm viewDidLoad để kiểm tra xem nó đã được chạy gấp đôi. Chức năng println chạy và xuất ra một cách chính xác, vì vậy tôi nghĩ rằng tôi có thể đã làm rối loạn điểm dừng của tôi bằng cách nào đó. Dù sao - mã chạy, nhưng nó vẫn không làm nổi bật bất kỳ mã nào của tôi gây ra giá trị nil.
CHỈNH SỬA 2: Theo yêu cầu, tôi đã chèn các phần mã của mình. Xin lưu ý rằng mã này là "bản nháp đầu tiên", nếu bạn muốn, và tôi chưa nhận được để làm sạch nó. Tôi chỉ cố gắng để làm cho nó làm việc:
@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
}
}
Tôi đã gỡ bỏ một số phần của mã mà tôi biết không có lý do để gây ra lỗi của tôi, chẳng hạn như @IBActions, didReceiveMemoryWarning(), vv ..
Chỉ cần rõ ràng, bạn đã đặt điểm ngắt ngoại lệ? –
@Allan Chau, Ban đầu tôi chỉ cần nhấp vào thanh bên cạnh một dòng mã để thêm điểm ngắt. Đây có phải là điểm ngắt ngoại lệ không? Tôi không nghĩ như vậy, nhưng tôi không chắc chắn. Tôi không phải tất cả những người quen thuộc với các loại breakpoint khác nhau. Tôi vừa thử thêm một điểm ngắt ngoại lệ được đặt thành Tất cả ngoại lệ, nhưng nó dừng lại ở cùng một khu vực. – CodeIt
Bạn có tìm thấy giải pháp nào cho nó không ?? Ngay cả tôi cũng phải đối mặt với cùng một vấn đề .. !! –