【问题标题】:Sending data to another view controller but every data i send is nil or empty将数据发送到另一个视图控制器,但我发送的每个数据都为零或为空
【发布时间】:2023-01-25 04:38:33
【问题描述】:

全部。
我在发送数据时遇到问题。
我尝试将数据从AgentDetailVC 发送到AbilitiesDetailsVC。但我不能。我尝试发送的每个数据都是零或空字符串。我设法在AgentListVC之前发送到AgentDetailsVC。你们都可以检查我的代码并帮助我吗?万分感谢。

这是我的AgenListVC

import UIKit

class AgentListVC: UIViewController {
    
    var agentsReference = ValorantReferenceApp().agents
 
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        
        self.tableView.rowHeight = 100
        // tableView.separatorStyle = .none
        tableView.delegate = self
        tableView.dataSource = self
        super.viewDidLoad()
     configureNavigationBar()
        
    }
   
    
    //MARK: - Configure Navigation Bar
    func configureNavigationBar() {
        self.navigationController?.navigationBar.prefersLargeTitles = true
          if var textAttributes = navigationController?.navigationBar.titleTextAttributes {
              textAttributes[NSAttributedString.Key.foregroundColor] = UIColor.red
              navigationController?.navigationBar.titleTextAttributes = textAttributes
          }
    }


}
//MARK: - Table View Methods
extension AgentListVC: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return agentsReference.count
   
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! AgentCellVC
        let agent = agentsReference[indexPath.row]
        cell.agentNameLAbel.text = agent.name
        cell.agentImageview.image = agent.iconAgent
        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        performSegue(withIdentifier: "toSecondVC", sender: nil)
       // tableView.deselectRow(at: indexPath, animated: true)
        
        
    }
    
    //MARK: - Prepare Segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        let destinationVC = segue.destination as! AgentDetailVC
        if let indexPath = tableView.indexPathForSelectedRow {
            let agent = agentsReference[indexPath.row]
            destinationVC.agentDetailVariables.choosenFlagImage = agent.agentFlagImage
            destinationVC.agentDetailVariables.choosenAgentIconImage = agent.iconAgent
            destinationVC.agentDetailVariables.choosenAgentType = agent.type.rawValue
            destinationVC.agentDetailVariables.choosenAgentName = agent.name
            destinationVC.choosenAgentAbilities = agent.abilities
   
         destinationVC.agentDetailVariables.choosenAgentAbilitiesImages = agent.agentAbilitiesImage
            destinationVC.choosenAgentVideoLink = agent.skillAbilitiesLink
 
        }
        
    }


}

这是我的AgentDetailVC

import UIKit

class AgentDetailVC: UIViewController {

    @IBOutlet var typeLabel: UILabel!
    @IBOutlet var characterImageView: UIImageView!
    @IBOutlet var flagImageView: UIImageView!
    @IBOutlet var tableView: UITableView!
    @IBOutlet var agentTypeImageView: UIImageView!
    var agentDetailVariables = AgentDetailVariables()
    var agentsReference = ValorantReferenceApp().agents
    var choosenAgentAbilities = [String]()
    var viewController = AbilitiesDetailsViewController()
    var choosenAgentVideoLink = [String]()
   
    
    override func viewDidLoad() {
  
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        viewLoad()
        print(choosenAgentAbilities)
        
    }
    
    
//MARK: - ViewLoad Function.
    func viewLoad() {
        
        flagImageView.image = agentDetailVariables.choosenFlagImage
        characterImageView.image = agentDetailVariables.choosenAgentIconImage
        typeLabel.text = agentDetailVariables.choosenAgentType
        title = agentDetailVariables.choosenAgentName
        tableView.rowHeight = 65
        tableView.separatorStyle = .none
        agentTypeImageView.image = UIImage(named: "\(agentDetailVariables.choosenAgentType)")
       // print(agentDetailVariables.choosenAgentVideoLink)
       
    }
    

}

//MARK: - TableView Methods
extension AgentDetailVC : UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return choosenAgentAbilities.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! AgentDetailsCellVC
        let agentAbilities = choosenAgentAbilities[indexPath.row]
        let skillImages = agentDetailVariables.choosenAgentAbilitiesImages[indexPath.row]
      print(agentAbilities)
    
        cell.skillNameLabel.text = agentAbilities
        cell.skillImageView.image = skillImages
 

        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         tableView.deselectRow(at: indexPath, animated: true)
        performSegue(withIdentifier: "toYoutubeVideos", sender: nil)
 
       
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toYoutubeVideos" {
            let destinationVC = segue.destination as! AbilitiesDetailsViewController
            if let indexPath = tableView.indexPathForSelectedRow {
                 let agent = agentsReference[indexPath.row]
                let link = choosenAgentVideoLink[indexPath.row]
                print(link)
                destinationVC.agentAbilitiesVideoURL = link
                destinationVC.choosenAgentSkillName = choosenAgentAbilities[indexPath.row]
            }
        }
     
    }
   
    
}

这是我的AbilitiesDetailsViewController

import UIKit
import AVKit
import AVFoundation
import MediaPlayer
import MobileCoreServices
import YoutubePlayer_in_WKWebView

class AbilitiesDetailsViewController: UIViewController, AVPlayerViewControllerDelegate {

    @IBOutlet var skillDetailsLabel: UILabel!
    @IBOutlet var skillNameLabel: UILabel!
    @IBOutlet var heroIconImageView: UIImageView!
    var agentAbilitiesVideoURL = ""
    var choosenAgentSkillName = ""
 
    override func viewDidLoad() {
       
        skillNameLabel.text = choosenAgentSkillName
        super.viewDidLoad()
    
        
//playAbilitiesVideos()
        
    }
    @IBAction func playVideoUsingURL(_ sender: Any) {
            playGlobalVideo()
        }

        func playGlobalVideo() {
            guard let videoURL = URL(string: agentAbilitiesVideoURL ?? "sad") else {
                return
            }
            let player = AVPlayer(url: videoURL)
            let vc = AVPlayerViewController()
            vc.player = player
            present(vc, animated: true) {
                player.play()
            }
        }
 
    
    func playAbilitiesVideos() {
        let player = AVPlayer(url: URL(string: "https://assets.contentstack.io/v3/assets/bltb6530b271fddd0b1/bltf4e7a6525fe6ec42/625f2c7cfd9afd4b1fe300ee/C-Prowler_video.mp4")!)
                let controller = AVPlayerViewController()
                                       present(controller, animated: true) {  }
                controller.player = player
                                       addChild(controller)
                view.addSubview(controller.view)
        controller.view.frame = CGRect(x: 50 , y: 50, width: 300, height: 300)
       
                controller.player = player
                controller.showsPlaybackControls = true
                player.isClosedCaptionDisplayEnabled = false
                player.play()
    }

}

这是我的结构。

struct Agent: Hashable{
  
    
    let name: String
    let type: AgentType
    let origin: String
    let abilities: [String]
    let iconAgent : UIImage
    let agentFlagImage : UIImage
    let agentAbilitiesImage: [UIImage]
   let skillAbilitiesLink: [String]
}

enum AgentType:String{
    case controller = "Controller"
    case sentinel = "Sentinel"
    case initiator = "Initiator"
    case duelist = "Duelist"
}

这是我的代理人。

struct ValorantReferenceApp {
    
static var agentIconImages = AgentIconImages()
static var agentFlagImages = AgentFlagImages()
    static var agentAbilitiesImages = AgentAbilitiesImages()
    var agents: [Agent] =  [
        
        Agent(name: "Brimstone", type: .controller, origin: "United States", abilities: ["Incendiary",
                                                                                         "Stim Beacon",
                                                                                          "Sky Smoke",
                                                                                          "Orbital Strike"],
              iconAgent: agentIconImages.iconBrimstone!,
              agentFlagImage: agentFlagImages.flagBrimstone!,
              agentAbilitiesImage: agentAbilitiesImages.abilitiesBrimstone, skillAbilitiesLink:
                
                ["https://assets.contentstack.io/v3/assets/bltb6530b271fddd0b1/blte2b9eb1923ef64fa/5ecad7d0f5bd13348a6cac75/Brimstone_Q_v001_web.mp4",
                    "https://assets.contentstack.io/v3/assets/bltb6530b271fddd0b1/bltc34c3d692ea83f41/5ecad7d0177c51692beb1fe4/Brimstone_C_v001_web.mp4",
                    "https://assets.contentstack.io/v3/assets/bltb6530b271fddd0b1/bltcf4359fed083686b/5ecad7d198f79d6925dbee07/Brimstone_E_v001_web.mp4",
                    "https://assets.contentstack.io/v3/assets/bltb6530b271fddd0b1/blt3d19d83ba51eb18f/5ecad7d297b46c1911ad1868/Brimstone_X_v001_web.mp4"
                 
                                                                                                ])

]

【问题讨论】:

  • 2个问题:如果你评论performSegue(withIdentifier: "toSecondVC", sender: nil),它会进入下一个屏幕吗?你在if let indexPath = tableView.indexPathForSelectedRow中传递了if吗?
  • 我评论它 segue 代码行并且不进入下一个屏幕。

标签: ios swift uitableview didselectrowatindexpath


【解决方案1】:

AgentDetailVC 中,您有以下代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    performSegue(withIdentifier: "toYoutubeVideos", sender: nil)
}

当用户选择一行时,你做的第一件事是取消选择那一行。然后你打电话给performSegue

prepare(for segue:...) 中,您可以这样做:

if let indexPath = tableView.indexPathForSelectedRow {

所以——tableView.indexPathForSelectedRow将永远是nil,因为你只是将它设置为零.

致电.deselectRow你执行转场。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    相关资源
    最近更新 更多