如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图

Posted

技术标签:

【中文标题】如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图【英文标题】:How to display a specific view from the action of the Snackbar in IOS app in SWIFT3 XCODE 8.2 【发布时间】:2018-12-03 15:54:24 【问题描述】:

如何通过 ios 中 Snackbar 的操作在 SWift 3 中显示我的 IOS 应用程序的另一个视图?我尝试了以下代码(即,一旦出现小吃栏并点击小吃栏的操作部分,则应打开 PatientViewController 的新视图,ID 为 PatientVC):

override func setSelected(_ selected: Bool, animated: Bool) 

        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
        let message = MDCSnackbarMessage()

        let action = MDCSnackbarMessageAction()
        let actionhandler = () in
           let actionmessage = MDCSnackbarMessage()
            actionmessage.text = "Button Click Success"
           MDCSnackbarManager.show(actionmessage)
            let storyboard = UIStoryboard(name: "Main", bundle: nil);
            let vc = storyboard.instantiateViewController(withIdentifier: "PatientVC") as! PatientViewController; 
            self.navigationController?.pushViewController(vc, animated: true);



        
        action.handler = actionhandler
        action.title = "Done"
        message.action = action





        message.text = "Welcome"
        MDCSnackbarManager.show(message)

    

PateintVC 是 id,PatientViewController 是我想显示的 viewController 的名称。但这给了我一个错误,EncounterFilterTableViewCell 没有成员 navigationController。只要我在我的代码中继承UIViewControllerUITableViewCell。来自类UITableViewCellUIviewController 的多重继承是错误的。 应该怎么做才能显示由PatientViewController 表示的视图,ID 为PatientVC。下面是我的班级的完整代码,其中有我的 Snackbar 代码。

import UIKit

import MaterialComponents.MaterialSnackbar

class EncounterFilterTableViewCell: UITableViewCell

    @IBOutlet weak var filterCheckBox: CheckBox!
    @IBOutlet weak var filterNameTextView: UITextView!

    var filterIndex : [String : Int] = [
        getDataFromAppLanguage("Final") + " " + getDataFromAppLanguage("Diagnosis") : 0,
        getDataFromAppLanguage("Diagnosis") : 1,
        getDataFromAppLanguage("Test") : 2,
        getDataFromAppLanguage("Operation") : 3,
        getDataFromAppLanguage("Drug") : 4,
        getDataFromAppLanguage("Media") : 5,
        getDataFromAppLanguage("FormsEn") : 6,
        getDataFromAppLanguage("PatientEn") + " " + getDataFromAppLanguage("Status") : 7
    ]
    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    @IBAction func filterBoxClicked(_ sender: AnyObject) 
        EncounterFilterViewController.updateFilterStatus(filterIndex[filterNameTextView.text]!)
    


    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
        let message = MDCSnackbarMessage()

        let action = MDCSnackbarMessageAction()
        let actionhandler = () in
           let actionmessage = MDCSnackbarMessage()
            actionmessage.text = "Button Click Success"
           MDCSnackbarManager.show(actionmessage)
             let storyboard = UIStoryboard(name: "Main", bundle: nil);
        let vc = storyboard.instantiateViewController(withIdentifier: "PatientVC") as! PatientViewController; 
        self.navigationController?.pushViewController(vc, animated: true);            
        
        action.handler = actionhandler
        action.title = "Done"
        message.action = action





        message.text = "Welcome"
        MDCSnackbarManager.show(message)

    


【问题讨论】:

问题现已解决。而不是在单元格的 setSelected 方法中使用小吃店代码。在特定 Cell 的 Table View Controller 的 didSelect 方法中添加以下代码。 【参考方案1】:

更改您的自定义单元格以使其工作 -

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    let componentFrame = CGRect(x: 20, y: 20, width: 40, height: 30)
    toggleSwitch.frame = componentFrame
    toggleSwitch.addTarget(self, action: #selector(SwitchTableViewCell.switchAction), for: .valueChanged)
    self.contentView.addSubview(toggleSwitch);


convenience init(style: UITableViewCellStyle, reuseIdentifier: String?, callingView : UIViewController) 

    self.init(style: style, reuseIdentifier: reuseIdentifier)
    callingViewController = callingView


override func setSelected(_ selected: Bool, animated: Bool) 
    let message = MDCSnackbarMessage()
    message.text = "The groundhog (Marmota monax) is also known as a woodchuck or whistlepig."

    let action = MDCSnackbarMessageAction()
    let actionHandler = () in

        let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
        let vc = storyBoard.instantiateViewController(withIdentifier: "DetailView")
        self.callingViewController?.navigationController?.pushViewController(vc, animated: true)

    
    action.handler = actionHandler
    action.title = "OK"
    message.action = action

    MDCSnackbarManager.show(message)

在 ViewController 中,像这样初始化单元格-

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    var cell : SwitchTableViewCell? = tableView.dequeueReusableCell(withIdentifier: "TestIdentifier") as? SwitchTableViewCell
    if(cell == nil)
    
        cell = SwitchTableViewCell(style: .default, reuseIdentifier: "TestIdentifier", callingView : self)
    

    cell?.toggleSwitch.isOn = myData1[indexPath.row];

    return cell!;

【讨论】:

以上是关于如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图的主要内容,如果未能解决你的问题,请参考以下文章

在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)

Socket.IO 错误:zlib 没有这样的模块(Swift 3,Xcode 8.3)

如何更改xcode 8.3.3(swift3)的语言设置[重复]

如何使约束适用于横向和纵向(xcode 8.1 / swift3 / storyboard)

现有的领域数据库不能在 swift 3.1 xcode 8 中工作

如何使用swift3增加导航栏的高度并更改xcode 8中状态栏的颜色?