2015-06-04 38 views
0

我正尝试使用Parse创建一个简单的tableview,它触发我已上传到Parse Cloud的PDF文档的URL。为什么我的Swift字符串变量返回nil?

在下面的代码中,我的变量thePDFFile确实将正确的URL输出到控制台。但是,当我尝试返回该变量时,它会出现零,应用程序崩溃。

我很确定我没有正确解开可选项,但我看不到在哪里。

带错误的函数名为GrabPDF() - > String。

import UIKit 
import Parse 
import Bolts 
import AVFoundation 
import AVKit 

public var AudioPlayer = AVPlayer() 
public var SelectedSong = Int() 

var theFile:String! 
var thePDFFile:String! 




class TableViewController: UITableViewController, AVAudioPlayerDelegate { 

var iDArray = [String]() 
var NameArray = [String]() 
var PDFArray = [String]() 
var PDFFileArray = [PFObject]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    var ObjectIDQuery = PFQuery(className:"Recordings") 
    ObjectIDQuery.findObjectsInBackgroundWithBlock({ 
     (objectsArray : [AnyObject]?, error: NSError?) -> Void in 

     var objectIDs = objectsArray as! [PFObject] 
     for i in 0...objectIDs.count-1{ 

      self.iDArray.append(objectIDs[i].valueForKey("objectId") as! String) 
      self.NameArray.append(objectIDs[i].valueForKey("RecordingName") as! String) 
      self.PDFArray.append(objectIDs[i].valueForKey("PDFFileName") as! String) 


      self.tableView.reloadData() 

       } 



      }) 

     } 



func grabSong() { 

    var SongQuery = PFQuery(className:"Recordings") 
    SongQuery.getObjectInBackgroundWithId(iDArray[SelectedSong], block: { 
     (object : PFObject?, error : NSError?) -> Void in 

     if let AudioFileURLTemp = object?.objectForKey("RecordingFile")?.url { 
      AudioPlayer = AVPlayer(URL: NSURL(string: AudioFileURLTemp!)) 
      AudioPlayer.play() 
      theFile = AudioFileURLTemp 



      } 



     }) 


    } 

func grabPDF() -> String { 

    var PDFQuery = PFQuery(className:"Recordings") 

    PDFQuery.getObjectInBackgroundWithId(iDArray[SelectedSong], block: { 
     (object: PFObject?, error : NSError?) -> Void in 

     if let PDFFileURLTemp = object?.objectForKey("PDFFile")?.url { 

      println(PDFFileURLTemp) 


      let thePDFFile = PDFFileURLTemp! as String 


      println("The value of thePDFFile is \(thePDFFile)") 



     } 

       }) 

    return thePDFFile 

} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return iDArray.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell 
    cell.textLabel?.text = NameArray[indexPath.row] 

    return cell 

} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    SelectedSong = indexPath.row 
    grabSong() 
    grabPDF() 
} 



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "WebView" { 
     if let VC2 = segue.destinationViewController as? WebViewController { 
      if let indexPath = tableView.indexPathForSelectedRow()?.row { 


       VC2.sentData = theFile 

      } 
     } 
    } 

} 




override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

回答

0

你的阴影thePDFFile与租出。当您通过右大括号并且您返回未设置的实例变量时,阴影从堆栈弹出。

+0

谢谢您的回答。我认为Swift消除了实例变量。看起来我错了。但是,我如何知道Swift中的类变量和它的实例之间的区别? – user3140521

+0

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

+0

Apple引用调用类变量“类型属性”,在类中它们只能是计算机属性。 –

相关问题