【问题标题】:Swift 3 pass values to Controller on UICollectionViewCell button clickSwift 3 在 UICollectionViewCell 按钮单击时将值传递给控制器
【发布时间】:2018-01-29 21:21:46
【问题描述】:

我是 iOS 开发的初学者,我使用 UICollectionView 实现了以下屏幕:

CollectionViewCell 文件代码为:

import UIKit

class EventCell: UICollectionViewCell{

var classEvent: Event?

@IBOutlet weak var eventTitle: UILabel!
@IBOutlet weak var eventTeams: UILabel!
@IBOutlet weak var eventTime: UILabel!
@IBOutlet weak var eventTeamOneImage: UIImageView!
@IBOutlet weak var eventTeamTwoImage: UIImageView!

@IBOutlet weak var leaderboardButton: UIButton!

var datasourceItem: Any?{
    didSet{
        guard let event = datasourceItem as? Event else { return }
        classEvent = event

        eventTitle.text = "Match \(event.matchNo) (\(event.matchStage))"
        eventTeams.text = "\(event.teamOne.nameAttr) vs \(event.teamTwo.nameAttr)"
        eventTime.text = "\(event.getEventLockTimeAsString())"
        eventTeamOneImage.loadImageUsingCache(withUrl: event.teamOne.flagPhoto)
        eventTeamTwoImage.loadImageUsingCache(withUrl: event.teamTwo.flagPhoto)
        leaderboardButton.addTarget(self, action: #selector(handleLeaderBoardClick), for: .touchUpInside)
    }
}

@IBAction func leagueButton(_ sender: Any) {
}

weak var delegate: HomeControllerDelegate?
func handleLeaderBoardClick() {
    if let matchId = classEvent?.id {
        print(matchId)
        delegate?.clickOnLeaderBoard(matchId: matchId)
    }
}   
 }

现在点击排行榜按钮(带有 1、2、3 的图标)我想打开新的排行榜控制器并传递 matchId,即 classEvent.id

如何将值传递给新控制器?最好的方法是什么。

【问题讨论】:

标签: ios swift3 uinavigationcontroller uicollectionview


【解决方案1】:

您可以通过 segue 传递比赛 ID:

在 LeaderBoard Controller 中设置一个属性:

var matchId:Int?

在控制器之间设置一个segue并添加一个标识符: 点击排行榜按钮:

self.performSegueWithIdentifier("yourSegueIdentifier", sender: self)

添加segue方法:

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

    if segue,identifier == "yourSegueIdentifier" {
        let destinationVC = segue.destinationViewController as LeaderbardController
        destinationVC.matchId = classEvent.id
        }
}
    }

【讨论】:

  • @IBAction func leaderboardButton(_ sender: UIButton) { self.performSegueWithIdentifier("leaderboardSegue", sender: self) } 在 leaderboardButton 上显示错误 'EventCell' 类型的值没有成员 'performSegueWithIdentifier'
  • 因为它是控制器方法,请将此方法添加到您的控制器中
  • prepareForSegue 函数呢? classEvent 在 EventCell 中定义
  • 当你调用 self.performSegueWithIdentifier("leaderboardSegue", sender: self) 然后调用 segue 的准备,它也是视图控制器方法.. 在你的视图控制器中定义它
  • 是的,我在视图控制器中定义了方法,但是如何获取 classEvent.id,因为我无法在视图控制器中访问 c​​lassEvent
【解决方案2】:

三个简单的步骤来得到你想要的:

  1. 使 BaseViewController 类成为 UiViewController 的子类。此类将是您项目中 UiViewcontroller 的替代,这意味着在创建任何视图控制器时 BaseViewController 将是父类。

  2. 在 BaseViewController.e.g-var data 中声明一个变量:Any?

  3. 然后,当从一个 viewcontroller 移动到另一个时,只需将任何类型的数据分配给在 BaseViewController 中声明的那个变量。 在新视图控制器的任何生命周期方法中,您都将使用 self.data 获取该数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2016-10-24
    相关资源
    最近更新 更多