如何禁用默认的删除滑动操作并改为显示我的自定义滑动操作?
How do I disable the default Delete swipe action and display my custom swipe action instead?
我正在我的应用中实现 leading/trailing 滑动操作。
前导滑动动作是 join/leave table 中的一个事件。拖尾滑动动作是删除一个事件。这两个滑动操作应该是有条件的,主要基于用户是否登录。
如果用户向左或向右滑动,并且用户未登录,我想显示一个警告("Login required...").
如果用户 已登录,则引导操作将有条件地标题为 "Leave" 或 "Join",具体取决于用户是否已加入活动或不。仅当用户也是事件的创建者时才会创建尾随 "Delete" 操作。
当我测试应用程序并且用户已登录时,一切正常。 (在我决定添加条件元素之前,这是有效的。)
当我测试应用程序并且用户未登录时,前导滑动完美运行:我向左滑动(在我的情况下),弹出警报。 TableViewCell 中没有出现滑动操作。
拖尾滑动也显示警报并做出正确反应,但出于某种原因它也显示 "Delete" 操作,即使我的代码使用标题 "Blah"。解除警报后,红色 "Delete" 操作仍然可见且可点击。
我也完全删除了 "trailingSwipe..." 方法,但 "Delete" 操作仍然出现,所以我需要弄清楚默认值在哪里,以便我可以将其关闭 and/or覆盖它。
如何防止出现默认删除操作并改为显示我的操作?
这是我的前导滑动代码:
override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
showLoginRequiredMessage()
return nil
} else {
var userName = people.randomElement() // for testing
if event.eventMembers.contains(userName) {
let index = event.eventMembers.firstIndex(of: userName)!
let leaveAction = UIContextualAction(style: .normal, title: "Leave") { (action, view, nil) in
event.eventMembers.remove(at: index)
tableView.setEditing(false, animated: true)
tableView.reloadRows(at: [indexPath], with: .automatic)
self.saveEvents()
}
leaveAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [leaveAction])
} else {
let joinAction = UIContextualAction(style: .normal, title: "Join") { (action, view, nil) in
event.eventMembers.append(userName)
tableView.setEditing(false, animated: true)
tableView.reloadRows(at: [indexPath], with: .automatic)
self.saveEvents()
}
joinAction.backgroundColor = .green
return UISwipeActionsConfiguration(actions: [joinAction])
}
}
}
这是我的尾随滑动代码:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
showLoginRequiredMessage()
return nil
} else {
let trailingAction = UIContextualAction(style: .destructive, title: "Blah") { (action, view, nil) in
tableView.setEditing(false, animated: true)
print ("Delete this event")
}
trailingAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [trailingAction])
}
}
这里是警报代码:
private func showLoginRequiredMessage() {
let ac = UIAlertController(title: "Login Required", message: "To modify an event, you must first login", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Sign In", style: .default, handler: {(action) in
if let authenticationController = self.storyboard?.instantiateViewController(withIdentifier: "authenticationScreen") {
self.present(UINavigationController(rootViewController: authenticationController), animated: true)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(ac, animated: true)
}
我已经解决了你的问题。我希望这对你有用。
在 trailingSwipeActions 方法中将动作样式更改为正常,您将获得 "Blah" 标题。
从您的 if 语句中删除 return nil
。
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
self.showLoginRequiredMessage()
}
let trailingAction = UIContextualAction(style: .normal, title: "Blah") { (action, view, boolval) in
print ("Custom action event")
tableView.setEditing(false, animated: true)
}
trailingAction.backgroundColor = .gray
return UISwipeActionsConfiguration(actions: [trailingAction])
}
然后,在下面的方法中添加.setEditing(false, animated: true)
private func showLoginRequiredMessage() {
let ac = UIAlertController(title: "Login Required", message: "To modify an event, you must first login", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Sign In", style: .default, handler: {(action) in
self.myTableView.setEditing(false, animated: true)
if let authenticationController = self.storyboard?.instantiateViewController(withIdentifier: "authenticationScreen") {
self.present(UINavigationController(rootViewController: authenticationController), animated: true)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: {(action) in
self.myTableView.setEditing(false, animated: true)
}))
present(ac, animated: true)
}
根据 ChillY 对这个问题的回答 (),我意识到问题是我返回的是 nil
而不是 UISwipeActionsConfiguration(actions: [])
。
现在我只需要弄清楚为什么在执行操作后滑动没有消失。有什么想法吗?
我正在我的应用中实现 leading/trailing 滑动操作。
前导滑动动作是 join/leave table 中的一个事件。拖尾滑动动作是删除一个事件。这两个滑动操作应该是有条件的,主要基于用户是否登录。
如果用户向左或向右滑动,并且用户未登录,我想显示一个警告("Login required...").
如果用户 已登录,则引导操作将有条件地标题为 "Leave" 或 "Join",具体取决于用户是否已加入活动或不。仅当用户也是事件的创建者时才会创建尾随 "Delete" 操作。
当我测试应用程序并且用户已登录时,一切正常。 (在我决定添加条件元素之前,这是有效的。)
当我测试应用程序并且用户未登录时,前导滑动完美运行:我向左滑动(在我的情况下),弹出警报。 TableViewCell 中没有出现滑动操作。
拖尾滑动也显示警报并做出正确反应,但出于某种原因它也显示 "Delete" 操作,即使我的代码使用标题 "Blah"。解除警报后,红色 "Delete" 操作仍然可见且可点击。
我也完全删除了 "trailingSwipe..." 方法,但 "Delete" 操作仍然出现,所以我需要弄清楚默认值在哪里,以便我可以将其关闭 and/or覆盖它。
如何防止出现默认删除操作并改为显示我的操作?
这是我的前导滑动代码:
override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
showLoginRequiredMessage()
return nil
} else {
var userName = people.randomElement() // for testing
if event.eventMembers.contains(userName) {
let index = event.eventMembers.firstIndex(of: userName)!
let leaveAction = UIContextualAction(style: .normal, title: "Leave") { (action, view, nil) in
event.eventMembers.remove(at: index)
tableView.setEditing(false, animated: true)
tableView.reloadRows(at: [indexPath], with: .automatic)
self.saveEvents()
}
leaveAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [leaveAction])
} else {
let joinAction = UIContextualAction(style: .normal, title: "Join") { (action, view, nil) in
event.eventMembers.append(userName)
tableView.setEditing(false, animated: true)
tableView.reloadRows(at: [indexPath], with: .automatic)
self.saveEvents()
}
joinAction.backgroundColor = .green
return UISwipeActionsConfiguration(actions: [joinAction])
}
}
}
这是我的尾随滑动代码:
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
showLoginRequiredMessage()
return nil
} else {
let trailingAction = UIContextualAction(style: .destructive, title: "Blah") { (action, view, nil) in
tableView.setEditing(false, animated: true)
print ("Delete this event")
}
trailingAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [trailingAction])
}
}
这里是警报代码:
private func showLoginRequiredMessage() {
let ac = UIAlertController(title: "Login Required", message: "To modify an event, you must first login", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Sign In", style: .default, handler: {(action) in
if let authenticationController = self.storyboard?.instantiateViewController(withIdentifier: "authenticationScreen") {
self.present(UINavigationController(rootViewController: authenticationController), animated: true)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(ac, animated: true)
}
我已经解决了你的问题。我希望这对你有用。 在 trailingSwipeActions 方法中将动作样式更改为正常,您将获得 "Blah" 标题。
从您的 if 语句中删除 return nil
。
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
if currentUserID == nil {
self.showLoginRequiredMessage()
}
let trailingAction = UIContextualAction(style: .normal, title: "Blah") { (action, view, boolval) in
print ("Custom action event")
tableView.setEditing(false, animated: true)
}
trailingAction.backgroundColor = .gray
return UISwipeActionsConfiguration(actions: [trailingAction])
}
然后,在下面的方法中添加.setEditing(false, animated: true)
private func showLoginRequiredMessage() {
let ac = UIAlertController(title: "Login Required", message: "To modify an event, you must first login", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Sign In", style: .default, handler: {(action) in
self.myTableView.setEditing(false, animated: true)
if let authenticationController = self.storyboard?.instantiateViewController(withIdentifier: "authenticationScreen") {
self.present(UINavigationController(rootViewController: authenticationController), animated: true)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: {(action) in
self.myTableView.setEditing(false, animated: true)
}))
present(ac, animated: true)
}
根据 ChillY 对这个问题的回答 (nil
而不是 UISwipeActionsConfiguration(actions: [])
。
现在我只需要弄清楚为什么在执行操作后滑动没有消失。有什么想法吗?