【问题标题】:Perform segue with multiple states on a UITableView在 UITableView 上执行多个状态的 segue
【发布时间】:2017-08-23 08:15:34
【问题描述】:

我有一个 UITableView 有两种状态。一种是用户登录时,另一种是用户注销时。两者都显示了不同的细节,每个都填充了大约 4 行。我目前所拥有的不起作用。我该如何修复它,或者我应该用更好的代码替换它。谢谢

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            if Auth.auth().currentUser != nil {
                if  loggedIn.contains("Find Event"){
                    performSegue(withIdentifier: "menutofind", sender: nil)
                }
                else if  loggedIn.contains("Create Event"){
                    performSegue(withIdentifier: "menutocreate", sender: nil)
                }
                else if  loggedIn.contains("Past Events"){
                    performSegue(withIdentifier: "menutopast", sender: nil)
                }
                else if  loggedIn.contains("Recently Viewed"){
                    performSegue(withIdentifier: "menutorv", sender: nil)
                }
                else if  loggedIn.contains("Help"){
                    performSegue(withIdentifier: "menutohelp", sender: nil)
                }
                else if  loggedIn.contains("Setting"){
                    performSegue(withIdentifier: "menutosetting", sender: nil)
                }
            }
            else {

                if  loggedOut.contains("Log In"){
                    performSegue(withIdentifier: "menutologin", sender: nil)
                }
                else if  loggedOut.contains("Find Event"){
                    performSegue(withIdentifier: "menutofind", sender: nil)
                }
                else if  loggedOut.contains("Create Event"){
                    performSegue(withIdentifier: "menutocreate", sender: nil)
                }
                else if  loggedOut.contains("Help"){
                    performSegue(withIdentifier: "menutohelp", sender: nil)
                } 

            }
        }

【问题讨论】:

  • 如何将值存储到 loggedIn 变量?我们需要那个代码
  • “我目前拥有的东西不起作用”为什么?有更好的方法来重构这段代码,但我认为它应该可以正常工作。
  • 提供有关您的问题的更多信息。
  • @vinodh 我正在存储这样的变量 var loggedIn = ["Find Event", "Create Event", "Past Events", "Recently Viewed", "Help", "Setting"] var loggedOut = [“登录”、“查找事件”、“创建事件”、“帮助”]
  • 1.) 使用开关 2.) 你能提供更多信息吗?也许考虑用其他组件重做这件事...... 3.)使用 indexPath.row 来区分单元格......

标签: ios swift uitableview firebase


【解决方案1】:

所以,如果我理解正确,那么您希望根据您点击的单元格触发特定的转场。您当前的代码将不起作用,因为您的第一个 if 语句将始终解析为 true,这可能是您只触发第一个 segue 的原因。

更好的方法是使用当前单元格的indexPath.row 并基于此选择一个segue,这将大大减少您的代码。我还建议创建一个struct,这样您就可以存储更多数据并在整个tableView 中更有效地使用它。

我在下面对您的代码进行了一些更改,看看是否有帮助。

struct UserCell {

    public let title: String
    public let segue: String

    init(title: String, segue: String) {
        self.title = title
        self.segue = segue
    }
}


class SideTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var loggout: UIButton!
    @IBOutlet weak var tableview: UITableView!
    @IBOutlet weak var dismissButton: UIButton!

    private let loggedIn: [UserCell] = [
        UserCell(title: "Find Event", segue: "menutofind"),
        UserCell(title: "Create Event", segue: "menutocreate"),
        UserCell(title: "Past Events", segue: "menutopast"),
        UserCell(title: "Recently Viewed", segue: "menutorv"),
        UserCell(title: "Help", segue: "menutohelp"),
        UserCell(title: "Setting", segue: "menutosetting")
    ]

    private let loggedOut: [UserCell] = [
        UserCell(title: "Log In", segue: "menutologin"),
        UserCell(title: "Find Event", segue: "menutofind"),
        UserCell(title: "Create Event", segue: "menutocreate"),
        UserCell(title: "Help", segue: "menutohelp")
    ]

    override func viewDidLoad() {
        super.viewDidLoad()
        dismissButton.layer.cornerRadius =
            dismissButton.frame.size.width / 2
        loggout.layer.cornerRadius =
            loggout.frame.size.width / 2
        if Auth.auth().currentUser != nil {
            loggout.isHidden = false
            print("User Signed In, Showing Relivent Info")

        } else {
            loggout.isHidden = true
            print("User Not Logged In, Showing Relivent Info")
        }
        tableview.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if Auth.auth().currentUser != nil {
            // User is signed in.
            return loggedIn.count

        } else {
            // No user is signed in.
            return loggedOut.count
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath as IndexPath)
        if Auth.auth().currentUser != nil {
            // User is signed in.
            cell.textLabel?.text = loggedIn[indexPath.item].title
            return cell

        } else {
            // No user is signed in.
            cell.textLabel?.text = loggedOut[indexPath.item].title
            return cell
        }
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if Auth.auth().currentUser != nil {
            performSegue(withIdentifier: self.loggedIn[indexPath.row].segue, sender: nil)
        }
        else {
            performSegue(withIdentifier: self.loggedOut[indexPath.row].segue, sender: nil)
        }
}

UserCell 结构可以轻松扩展以存储更多数据,并在需要时轻松访问。

【讨论】:

  • 谢谢。这可行,但是当我登录并单击创建事件并最近查看时,它会使应用程序崩溃。
  • 这可能是您代码中其他地方的问题,请确保您的 segue 标识符正确并且其他所有设置都正确。如果您确实发现上面的代码有问题,请告诉我,我会调查一下!
【解决方案2】:

我解决了同样的问题,在我的例子中,我使用了两个数组来存储选项,所以一个你将存储用户登录时将出现的选项,另一个你将存储用户登录时出现的选项退出。

然后我使用 indexPath.row 来检测选择了哪个位置。不要忘记使用 if 来检测用户是否登录。

【讨论】:

    【解决方案3】:

    这是完整的代码

    import UIKit
    import Firebase
    
        class SideTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    
    
            @IBOutlet weak var loggout: UIButton!
            @IBOutlet weak var tableview: UITableView!
            @IBOutlet weak var dismissButton: UIButton!
    
            var loggedIn = ["Find Event", "Create Event", "Past Events", "Recently Viewed", "Help", "Setting"]
    
            var loggedOut = ["Log In", "Find Event", "Create Event", "Help"]
    
    
            override func viewDidLoad() {
                super.viewDidLoad()
                dismissButton.layer.cornerRadius =
                dismissButton.frame.size.width / 2
                loggout.layer.cornerRadius =
                loggout.frame.size.width / 2
                if Auth.auth().currentUser != nil {
                    loggout.isHidden = false
                    print("User Signed In, Showing Relivent Info")
    
                } else {
                    loggout.isHidden = true
                    print("User Not Logged In, Showing Relivent Info")
                }
                tableview.reloadData()
            }
    
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                if Auth.auth().currentUser != nil {
                    // User is signed in.
                    return loggedIn.count
    
                } else {
                    // No user is signed in.
                    return loggedOut.count
                }
            }
    
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath as IndexPath)
                if Auth.auth().currentUser != nil {
                    // User is signed in.
                    cell.textLabel?.text = loggedIn[indexPath.item]
                    return cell
    
                } else {
                    // No user is signed in.
                    cell.textLabel?.text = loggedOut[indexPath.item]
                    return cell
                }
            }
    
            func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                if Auth.auth().currentUser != nil {
                    if  loggedIn.contains("Find Event"){
                        performSegue(withIdentifier: "menutofind", sender: nil)
                    }
                    else if  loggedIn.contains("Create Event"){
                        performSegue(withIdentifier: "menutocreate", sender: nil)
                    }
                    else if  loggedIn.contains("Past Events"){
                        performSegue(withIdentifier: "menutopast", sender: nil)
                    }
                    else if  loggedIn.contains("Recently Viewed"){
                        performSegue(withIdentifier: "menutorv", sender: nil)
                    }
                    else if  loggedIn.contains("Help"){
                        performSegue(withIdentifier: "menutohelp", sender: nil)
                    }
                    else if  loggedIn.contains("Setting"){
                        performSegue(withIdentifier: "menutosetting", sender: nil)
                    }
                }
                else {
    
                    if  loggedOut.contains("Log In"){
                        performSegue(withIdentifier: "menutologin", sender: nil)
                    }
                    else if  loggedOut.contains("Find Event"){
                        performSegue(withIdentifier: "menutofind", sender: nil)
                    }
                    else if  loggedOut.contains("Create Event"){
                        performSegue(withIdentifier: "menutocreate", sender: nil)
                    }
                    else if  loggedOut.contains("Help"){
                        performSegue(withIdentifier: "menutohelp", sender: nil)
                    } 
    
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多