2015-05-01 21 views
11

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: enter image description here 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 ..

+0

Chỉ cần rõ ràng, bạn đã đặt điểm ngắt ngoại lệ? –

+0

@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

+0

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 đề .. !! –

Trả lời

2

Kể cả câu hỏi cũ. Tôi đã tìm thấy sự cố của mình bằng cách xóa dữ liệu có nguồn gốc khỏi xcode.

Xcode -> window-> Projects sau đó chọn và xóa dữ liệu xuất phát dự án của bạn.

+0

là điều duy nhất giải quyết được lỗi? Tôi cũng gặp vấn đề tương tự – DrPatience

+0

Tôi đã khai thác dự án và cập nhật nó từ Swift 1 lên Swift 2.1. Khi tôi chạy nó trên thiết bị của tôi, nó không còn lỗi nữa. Mọi thứ có thể đã thay đổi khi tôi cập nhật nó từ Swift 1 lên Swift 2.1, nhưng trước khi chạy nó trên thiết bị của tôi, tôi đã thử những gì bạn gợi ý. Tôi sẽ chấp nhận câu trả lời của bạn bởi vì nó có thể đã được cố định nó (Mặc dù tôi sẽ không bao giờ biết nếu nó là câu trả lời hoặc nếu nó là cái gì khác). – CodeIt

+0

không hoạt động với tôi –

1

Tôi không nghĩ rằng có thể xác định chính xác vị trí của sự cố mà không thấy mã của bạn.

Một nơi nào đó trong mã của bạn, bạn có thể đã buộc downcast một biến as!. Nếu bạn thay đổi điều này thành:

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

Sau đó, điều này sẽ khắc phục được sự cố của bạn. Đọc này để tìm hiểu thêm về truyền trong nhanh chóng:

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

+0

Tôi đã trải qua và thay thế "as!" với "như?", nhưng nó vẫn không sửa chữa được vấn đề. Cảm ơn bạn đã liên kết - Tôi sẽ xem xét và tìm hiểu về cách truyền phù hợp! Ngoài ra, tôi đã cập nhật câu hỏi để bao gồm mã mà tôi nghĩ là có liên quan để trả lời câu hỏi này. Nó hiện khá lộn xộn. – CodeIt

+0

bạn đã đặt mã trong đại biểu ứng dụng của mình chưa? Tôi nghĩ rằng vấn đề đang xảy ra trước khi bộ điều khiển xem này gọi viewDidLoad. Có thể kiểm tra liên kết currentPosLabel hoặc imageView trong bảng phân cảnh của bạn. –

+0

Tôi không có mã vượt quá trong AppDelegate của mình và tôi đã kiểm tra kỹ tất cả các liên kết trong các mục trong bảng phân cảnh của mình. Tất cả IBOutlets/IBActions được kết nối chính xác. Nếu đây là một vấn đề với các kết nối tôi mong đợi nó sẽ hiển thị khi chạy trên Simulator. Điều duy nhất tôi có thể nghĩ là gây ra vấn đề là tôi sử dụng Nhóm ứng dụng và NSUserDefaults để chuyển dữ liệu giữa tiện ích và ứng dụng chính, tuy nhiên, điều này chỉ được gọi khi nút "chia sẻ" được nhấn. – CodeIt

0

tôi nhận được lỗi tương tự khi cố gắng thiết lập một giá trị không bắt buộc với giá trị của một tùy chọn ngầm-quà nào đó là nil.

Ví dụ:someGlobalFunction() trả về một ImplicitlyUnwrappedOptional với giá trị nil sau đó bạn cố gắng đặt giá trị đó thành giá trị thông thường.

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

class MyClass { 
    let aVariable: String 

    init() { 
     aVariable = someGlobalFunction() 
    } 
} 
1

Bạn nên chạy cùng một thiết bị trên trình mô phỏng và thiết bị thực. Ví dụ: nếu bạn chạy trên 5s trên thiết bị thực thì hãy thử cùng một thiết bị trên trình mô phỏng.Bởi chạy trình mô phỏng, nó chắc chắn sẽ hiển thị lỗi. không kết nối @IBActions. Hy vọng rằng mẹo này sẽ giúp bạn.

+0

THIÊN CHÚA. BAN PHƯỚC. BẠN. – Mihado

Các vấn đề liên quan