Ios 使用MMDROURCONTROLLER进行快速准备

Ios 使用MMDROURCONTROLLER进行快速准备,ios,swift,variables,segue,mmdrawercontroller,Ios,Swift,Variables,Segue,Mmdrawercontroller,我已经搜索了每个地方,找到了解决这个错误的方法,我还尝试使用nsuserdefaults、struct和global var将我的变量传递给其他ViewController。我正在使用mmdrawer,并在我的第一个viewcontroller上设置了导航控件,我将其命名为userOview和identifier membersArea。每当我尝试使用prepareforsegue时,就会出现以下错误 Could not cast value of type 'xxxxxxxx.DjInform

我已经搜索了每个地方,找到了解决这个错误的方法,我还尝试使用nsuserdefaults、struct和global var将我的变量传递给其他ViewController。我正在使用mmdrawer,并在我的第一个viewcontroller上设置了导航控件,我将其命名为userOview和identifier membersArea。每当我尝试使用prepareforsegue时,就会出现以下错误

Could not cast value of type 'xxxxxxxx.DjInformation' (0x115da8) to 'UINavigationController' (0x3ad405e0).
我的appdelegate看起来像这样

    import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var centerContainer: MMDrawerController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.



        let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
        let isLoggedIn:Int = prefs.integerForKey("ISLOGGEDIN") as Int

        if (isLoggedIn == 1){

        var rootViewController = self.window!.rootViewController

        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var centerViewController = mainStoryboard.instantiateViewControllerWithIdentifier("memberArea") as! userOverview

        var leftViewController = mainStoryboard.instantiateViewControllerWithIdentifier("LeftSideViewController") as! LeftSideViewController

        var rightViewController = mainStoryboard.instantiateViewControllerWithIdentifier("RightSideViewController")as! RightSideViewController

        var leftSideNav = UINavigationController(rootViewController: leftViewController)
        var centerNav = UINavigationController(rootViewController: centerViewController)
        var rightNav = UINavigationController(rootViewController: rightViewController)

        centerContainer = MMDrawerController(centerViewController: centerNav, leftDrawerViewController: leftSideNav,rightDrawerViewController:rightNav)

        centerContainer!.openDrawerGestureModeMask = MMOpenDrawerGestureMode.PanningCenterView;
        centerContainer!.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.PanningCenterView;

        window!.rootViewController = centerContainer
        window!.makeKeyAndVisible()

         UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

        }

        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        // Saves changes in the application's managed object context before the application terminates.
        self.saveContext()
    }

    // MARK: - Core Data stack

    lazy var applicationDocumentsDirectory: NSURL = {
        // The directory the application uses to store the Core Data store file. This code uses a directory named "bfd.Be_Fit_Donate" in the application's documents Application Support directory.
        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        return urls[urls.count-1] as! NSURL
    }()

    lazy var managedObjectModel: NSManagedObjectModel = {
        // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
        let modelURL = NSBundle.mainBundle().URLForResource("Be_Fit_Donate", withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
    }()

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
        // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
        // Create the coordinator and store
        var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("Be_Fit_Donate.sqlite")
        var error: NSError? = nil
        var failureReason = "There was an error creating or loading the application's saved data."
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil {
            coordinator = nil
            // Report any error we got.
            var dict = [String: AnyObject]()
            dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
            dict[NSLocalizedFailureReasonErrorKey] = failureReason
            dict[NSUnderlyingErrorKey] = error
            error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            // Replace this with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog("Unresolved error \(error), \(error!.userInfo)")
            abort()
        }

        return coordinator
    }()

    lazy var managedObjectContext: NSManagedObjectContext? = {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext()
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        if let moc = self.managedObjectContext {
            var error: NSError? = nil
            if moc.hasChanges && !moc.save(&error) {
                // Replace this implementation with code to handle the error appropriately.
                // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                NSLog("Unresolved error \(error), \(error!.userInfo)")
                abort()
            }
        }
    }

}
我试图从中发送prepareforsegue的视图控制器如下

    import UIKit
import AVFoundation
import AVKit
import Foundation
import Social

public var AudioPlayer = AVPlayer()
public var SelectedSongNumber = Int()
public var TrackName = String()
public var TrackImage = String()
public var TrackDJ = String()


class MusicListTableViewController: UITableViewController, AVAudioPlayerDelegate{

    @IBOutlet weak var playerView: UIView!
    @IBOutlet weak var songName: UILabel!
    @IBOutlet weak var playButton: UIButton!    
    @IBOutlet weak var trackDjName: UILabel!
    @IBOutlet weak var imageArtwork: UIImageView!



    var trackName = [String]()
    var artistLabel = [String]()
    var trackUrl = [String]()
    var artWork = [String]()
    var tags = [String]()
    var artistId = [String]()
    var djInfo = ""


    @IBAction func facebookButton(sender: UIButton) {
        if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook){
            var facebookSheet:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
            facebookSheet.setInitialText("Share on Facebook")
            self.presentViewController(facebookSheet, animated: true, completion: nil)
        } else {
            var alert = UIAlertController(title: "Accounts", message: "Please login to a Facebook account to share.", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
        }

    }
    @IBAction func tritterButton(sender: UIButton) {
        if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter){
            var twitterSheet:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
            twitterSheet.setInitialText("Share on Twitter")
            self.presentViewController(twitterSheet, animated: true, completion: nil)
        } else {
            var alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to share.", preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)
        }

    }

    @IBAction func myPlayList(sender: UIButton) {
        var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("myMusicList") as! myMusicList

        var centerNavController = UINavigationController(rootViewController: centerViewController)

        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        appDelegate.centerContainer!.centerViewController = centerNavController
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Right, animated: true, completion: nil)
    }
    @IBAction func favoriteButton(sender: UIButton) {

         var  favSong = trackName[SelectedSongNumber]

        var alertView:UIAlertView = UIAlertView()
        alertView.title = "Nummer Toegevoegd"
        alertView.message = "Het nummer \(favSong) is nu toegevoegd aan uw favorieten muziek lijst"
        alertView.delegate = self
        alertView.addButtonWithTitle("OK")
        alertView.show()
    }

    @IBAction func djInformation(sender: UIButton) {

        var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("djInformation") as! DjInformation

        var centerNavController = UINavigationController(rootViewController: centerViewController)

        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        appDelegate.centerContainer!.centerViewController = centerNavController
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Right, animated: true, completion: nil)
    }

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

           var artist_label = artistLabel[SelectedSongNumber]

        if (segue.identifier == "djInformation" ){
            var detailVC = segue.destinationViewController as! UINavigationController
            let targetController = detailVC.topViewController as! DjInformation
            targetController.djInfo = "hello"

        }
    }

    func getMusicListJSON(){
        let urlString = "http://xxxxxxxxxx"
        let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
        let url = NSURL( string: urlEncodedString!)
        var task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, innerError) in
            let json = JSON(data: data)
            let musicArray = json.arrayValue

            //NSLog("\(json)")

            dispatch_async(dispatch_get_main_queue(), {
                for musiclist in musicArray
                {
                    let track_name = musiclist["track_name"].stringValue
                    let artist = musiclist["artist"].stringValue
                    let track_url = musiclist["track_url"].stringValue
                    let art_work = musiclist["artwork"].stringValue
                    let track_tags = musiclist["tags"].stringValue
                    let artist_id = musiclist["artist_id"].stringValue
                    //println( "track_name: \(track_name) artist: \(artist) track_url: \(track_url) artwork: \(art_work) track_tags: \(track_tags) artist_id: \(artist_id)" )
                    self.trackName.append(track_name)
                    self.artistLabel.append(artist)
                    self.trackUrl.append(track_url)
                    self.artWork.append(art_work)
                    self.tags.append(track_tags)
                    self.artistId.append(artist_id)
                }

                dispatch_async(dispatch_get_main_queue(), {
                    self.tableView.reloadData()
                    return
                })
            })

        }

        task.resume()
    }


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

        playButton.addTarget(self, action: "playButtonTapped:", forControlEvents: .TouchUpInside)

        playerView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height * 0.7)

        playButton.hidden = true

        var error: NSError?
        var success = AVAudioSession.sharedInstance().setCategory(
            AVAudioSessionCategoryPlayAndRecord,withOptions: .DefaultToSpeaker, error: &error)
        if !success{
            NSLog("Failed to set audio session category, Error: \(error)")
        }
    }



    func playButtonTapped(sender: AnyObject){
        // set play image to pause wehen video is paused and also back

        if AudioPlayer.rate == 0
        {
            AudioPlayer.play()
            playButton.setImage(UIImage(named:"pause"), forState: UIControlState.Normal)

        } else {
            AudioPlayer.pause()
            playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal)


        }
    }


    @IBAction func slideOutMenu(sender: AnyObject) {
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left,  animated: true, completion: nil)
    }

    @IBAction func musicMenu(sender: AnyObject) {
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Right,  animated: true, completion: nil)
    }




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

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBarHidden = true
    }




    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

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


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("playerCell", forIndexPath: indexPath) as! playerTableViewCell

        // Configure the cell...
        cell.artistName.text = trackName[indexPath.row]
        cell.trackName.text = artistLabel[indexPath.row]
        return cell



    }
    // set the song to play according to the table row selected. Also set the name and artist.
    func playSong() {

        var playnumber = trackUrl[SelectedSongNumber]
        var TrackName = trackName[SelectedSongNumber]
        var TrackImage = artWork[SelectedSongNumber]
        var TrackDJ = artistLabel[SelectedSongNumber]
        var DjId = artistId[SelectedSongNumber]

        AudioPlayer = AVPlayer(URL: NSURL(string: playnumber))

        AudioPlayer.play()
        songName.text = TrackName
        trackDjName.text = TrackDJ
        load_artwork(TrackImage)
        playButton.hidden = false


            }

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

      SelectedSongNumber = indexPath.row
        playSong()


    }

    // set the song artwork to display in the player for the current playing song.
    func load_artwork(urlString: String){
        var imgURL: NSURL = NSURL(string: urlString)!
        let request: NSURLRequest = NSURLRequest(URL: imgURL)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!,error: NSError!) -> Void in
            if error == nil {
                self.imageArtwork.image = UIImage(data: data)
            }
    })
}
}
我认为这两个代码应该是问题的原因。但到目前为止,我找不到任何方法来评估任何变量,我需要这些来完成我的应用程序。我做错了什么

我真的需要一些帮助才能让这一切顺利进行。也许我的导航控制器设置正确。作为第一个viewcontroller,应将其嵌入其中。但我不确定我做得是否正确


谢谢你的帮助

如果你知道该怎么做,我找到了一个非常简单的解决方案。当您使用mmdrawer并希望发送数据时,您可以只创建一个prepareforsegue,但还需要创建一个覆盖mmdrawer的segue。我发现您使用以下内容就像使用prepareforsgue一样

@IBAction func djInformation(sender: UIButton) {

var artist_label = artistLabel[SelectedSongNumber]

        var centerViewController = self.storyboard?.instantiateViewControllerWithIdentifier("djInformation") as! DjInformation

centerViewController.djINfo = "\(artist_label)"
        var centerNavController = UINavigationController(rootViewController: centerViewController)

        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        appDelegate.centerContainer!.centerViewController = centerNavController
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Right, animated: true, completion: nil)
    }
所以基本上你在PrepareForegue中所做的,你也可以在启动mmdrawercontroller的按钮中做

希望这是有意义的,并帮助其他人。我绝不是一个职业选手,我也不确定这是否合适,或者更像是一个黑客。但是它又快又容易