我有一个具有两种状态的 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)
}
}
}
最佳答案
因此,如果我的理解正确,那么您希望根据您点击的单元格触发特定的转场。您当前的代码将不起作用,因为您的第一个 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
结构可以轻松扩展以存储更多数据,并在您需要时轻松访问它。
关于ios - 在 UITableView 上执行具有多个状态的 segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834257/