简体   繁体   English

将数据从类传递到视图控制器的相同实例

[英]Passing data from a class to same instance of a viewcontroller

When a specific event happens(in my case when a tab bar is changed) I want to create a new link from an Array. 当发生特定事件时(在我的情况下,当选项卡栏更改时),我想从数组创建一个新链接。 I have gotten this to work but the problem I am not facing is when i try to pass the generated link to the same viewcontroller i get an error 我已经做到这一点,但我没有遇到的问题是当我尝试将生成的链接传递给同一个viewcontroller时出现错误

fatal error: unexpectedly found nil while unwrapping an Optional value 致命错误:解开Optional值时意外发现nil

This happens when I try to change the UILabel movietitle and imageview. 当我尝试更改UILabel movietitle和imageview时,会发生这种情况。 I think this is because every time it sends the link it creates a new ViewController instead of using the existing one. 我认为这是因为每次发送链接时,它都会创建一个新的ViewController而不是使用现有的ViewController。 Might also be that i have missed an unwrapped value somewhere. 也可能是因为我错过了某个地方的包装价值。 Hope someone here can help me! 希望这里有人可以帮助我!

StringBuilder: StringBuilder的:

import UIKit

class StringBuilder: NSObject {

let urlString = "https://api.themoviedb.org/3/discover/movie?api_key=935f539acb9e5534ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=12"

let urlStringMultipleGenres = "https://api.themoviedb.org/3/discover/movie?api_key=935f539acbf5534ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=28,12,10749"
var currentGenreArray: Array<Int> = []






//This will be run after the user has selected or deselected genres in the genreControllerView
func updateGenres(genreArrayIn: Array<Int>){
    print("update genres input: ")
    print(genreArrayIn)

    //If new array input is the same as old arrayinput, do nothing
    if genreArrayIn == currentGenreArray{
        return
    }
    else{
        let returnedLink = generateString(genreID: genreArrayIn)
        print("Returned link after generate string" + returnedLink)
        sendLink(link: returnedLink)
    }


}
//After the updated genres have been put into an Array, this function will generate the whole string which
//will be the main String the getMovieRequest follows
func generateString(genreID: Array<Int>) -> String{

    let filteredGenreArray = filterZeroes(unfilteredArray: genreID)

    currentGenreArray = genreID
    print("current genre array: ")
    print(currentGenreArray)

    let baseString = "https://api.themoviedb.org/3/discover/movie?api_key=935f539acbfed4ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres="
    var generatedString = baseString

    for id in filteredGenreArray{
        let k = String(id)
        generatedString += k + ","
    }
    print("Generated Link from Strinbuilder: ")
    print(generatedString)


    return generatedString
}
func filterZeroes(unfilteredArray: Array<Int>) -> Array<Int>{

    let filteredGenreArray = unfilteredArray.filter {$0 > 0}
    print("filtered array: ")
    print(filteredGenreArray)
    return filteredGenreArray
}


func sendLink(link: String){
    let storyBoard = UIStoryboard(name: "Main", bundle: nil)
    let movieVC = storyBoard.instantiateViewController(withIdentifier: "movieView") as! ViewController

    movieVC.getMovieData(activeGenreLink: link)
    print("new link sent from sendlink()")
}

} }

ViewController: 视图控制器:

import UIKit
import Alamofire
import AlamofireImage





class ViewController: UIViewController{

static let sharedInstance = ViewController()

var movieIndex = 0
var movieArray:[Movie] = []
var downloadGrp = DispatchGroup()




@IBOutlet var uiMovieTitle: UILabel!

@IBOutlet var uiMoviePoster: UIImageView!

@IBOutlet var posterLoading: UIActivityIndicatorView!



override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let firstTimeLink = "https://api.themoviedb.org/3/discover/movie?api_key=935f539acb9e5534ddeed3fb57e&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_genres=35,18"

    getMovieData(activeGenreLink: firstTimeLink)

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    uiMoviePoster.isUserInteractionEnabled = true
    uiMoviePoster.addGestureRecognizer(tapGestureRecognizer)
    print("settings Sucessful")
}


func imageTapped(tapGestureRecognizer: UITapGestureRecognizer){





     performSegue(withIdentifier: "detailsSegue", sender: self)
    }



@IBAction func yesBtn(_ sender: UIButton) {
    movieIndex += 1
    updateUI()
}

@IBAction func seenBtn(_ sender: UIButton) {
    movieIndex += 1
}

@IBAction func noBtn(_ sender: UIButton) {
    movieIndex += 1
}




//Get movie data

func getMovieData(activeGenreLink: String){

    //self.posterLoading.startAnimating()

    movieIndex = 0
    self.downloadGrp.enter()
        Alamofire.request(activeGenreLink).responseJSON { response in
            //print(response.request)  // original URL request
            //print(response.response) // HTTP URL response
            //print(response.data)     // server data
            //print(response.result)   // result of response serialization

            self.movieArray = []

            print(self.movieArray)
            if let json = response.result.value as? Dictionary<String,AnyObject> {
                if let movies = json["results"] as? [AnyObject]{
                    for movie in movies{
                        let movieObject: Movie = Movie()

                        let title = movie["title"] as! String
                        let releaseDate = movie["release_date"] as! String
                        let posterPath = movie["poster_path"] as! String
                        let overView = movie["overview"] as! String
                        let movieId = movie["id"] as! Int
                        let genre_ids = movie["genre_ids"] as! [AnyObject]

                        movieObject.title = title
                        movieObject.movieRelease = releaseDate
                        movieObject.posterPath = posterPath
                        movieObject.overView = overView
                        movieObject.movieId = movieId


                        for genre in genre_ids{//Genre ids, fix this
                            movieObject.movieGenre.append(genre as! Int)
                        }

                        Alamofire.request("http://image.tmdb.org/t/p/w1920" + posterPath).responseImage {
                            response in
                            //print(response.request)
                            //print(response.response)
                            //debugPrint(response.result)

                            if var image = response.result.value {
                                image = UIImage(data: response.data!)!

                                movieObject.poster = image
                            }
                        }

                        self.movieArray.append(movieObject)


                    }//End of for each movie
                }
                else{
                    print("error while making results anyobject")
                }
            }
            else{
            print("error while trying to make NSDictionary")}
     self.downloadGrp.leave()
    }//End of Json request


    downloadGrp.notify( queue: .main){
        print("all downloads finished")


        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
            print(self.movieArray[0].title!)
            self.updateUI()
            print("updatedUI")
        }


    }

}//End of getmoviedata


override func prepare(for segue: UIStoryboardSegue,sender: Any?){

    // Create a variable that you want to send
    let currentMovie = self.movieArray[movieIndex]


    if let destinationVC = segue.destination as? DetailsViewController{
        destinationVC.currentMovie = currentMovie
    }

}

func updateUI(){
    //self.posterLoading.stopAnimating()
    if uiMoviePoster == nil{
    print(uiMovieTitle.debugDescription)
    }
    else{
        print("first time debugID: " + uiMovieTitle.debugDescription)
    uiMovieTitle.text = self.movieArray[movieIndex].title
    uiMoviePoster.image = self.movieArray[movieIndex].poster
    }

}


}

You want to grab a sharedInstance not instantiate from a storyboard 您想获取不实例化故事板的sharedInstance

let movieVC = ViewController.sharedInstance()

but I still do not understand why do you need to do it like this 但我还是不明白为什么你需要这样做

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 iOS Swift,将ViewController中的变量传递给同一ViewController中的类 - iOS Swift, Passing a variable from ViewController to a class in the same ViewController 将数据从我的viewcontroller类传递到放置在同一场景中的自定义类UIView时,“在包装可选值时出现意外nil” - 'unexpected nil while wrapping optional value' when passing data from my viewcontroller class to my custom class UIView placed in the same scene 将数据从 ViewController 传递到 AppDelegate - Passing data from ViewController to AppDelegate 将数据从ViewController传递到UITableViewController - Passing Data from ViewController to UITableViewController 将数据从ViewController传递到tableviewCell - Passing data from a viewcontroller into tableviewCell ios-将数据传递给另一个方法-相同的viewController - ios - Passing on data to another method - same viewController 在 object class 和 ViewController (Swift) 之间传递数据 - Passing data between an object class and a ViewController (Swift) 将数据从ViewController传递给类 - Pass data from ViewController to class Swift:将数据从ViewController中的tableView传递到另一个ViewController - Swift: Passing data from a tableView in a ViewController to another ViewController 将数据从一个ViewController中的某些TextField传递到另一个ViewController中的TextView - Passing data from some TextFields in one ViewController to a TextView in another ViewController
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM