【发布时间】:2011-09-12 09:33:13
【问题描述】:
如何在导航栏上实现一个按钮,以便用户能够重新排序和删除 UITableView 的行?
我是否必须创建自己的工具栏按钮才能为我的 UITableView 创建编辑/完成按钮?
【问题讨论】:
标签: iphone uitableview
如何在导航栏上实现一个按钮,以便用户能够重新排序和删除 UITableView 的行?
我是否必须创建自己的工具栏按钮才能为我的 UITableView 创建编辑/完成按钮?
【问题讨论】:
标签: iphone uitableview
只需在您的UITableViewController 的viewDidLoad 中添加这一行
self.navigationItem.leftBarButtonItem = self.editButtonItem;
如果您的表视图超级视图是UINavigationController,它将起作用。此行将添加按钮,该按钮将在编辑模式下推送表格并退出表格。
【讨论】:
cell.showsReorderControl = TRUE; 并实现- (BOOL)tableView:(UITableView *)tableview canMoveRowAtIndexPath:(NSIndexPath *)indexPath & - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 方法
通常做的是创建自己的自定义 BarbuttonItem,然后将此按钮分配为右侧导航栏按钮项:
UIBarButtonItem *barButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"Edit"
style:UIBarButtonItemStylePlain
target:self
action:@selector(toggleEdit)];
self.navigationItem.rightBarButtonItem = barButtonItem;
[barButtonItem release];
这里是 toggleEdit 方法:
-(void)toggleEdit{
[self.tableView setEditing:!self.tableView.editing animated:YES];
if (self.tableView.editing)
[self.navigationItem.rightBarButtonItem setTitle:@"Done"];
else
[self.navigationItem.rightBarButtonItem setTitle:@"Edit"];
}
【讨论】:
UIButton *btnname=[UIButton buttonWithType:UIButtonTypeSystem];
[btnname setFrame:CGRectMake(0,0,110,35)];
[btnname setFont:[UIFont boldSystemFontOfSize:18]];
[btnname setTitle: @"Delete" forState: UIControlStateNormal];
[btnname setTitleColor:UIColorFromRGB(0xCC0707) forState:UIControlStateNormal];
btnname.backgroundColor=UIColorFromRGB(0xE6E7E8);
btnname.showsTouchWhenHighlighted = YES;
[btnname addTarget:self
action:@selector(toggleEdit)
forControlEvents:UIControlEventTouchDown];
UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:btnname];
self.navigationItem.rightBarButtonItem = barItem;
-(void)toggleEdit{
[self.tableView setEditing:!self.tableView.editing animated:YES];
if (self.tableView.editing)
[btnname setTitle: @"Done" forState: UIControlStateNormal];
else
[btnname setTitle: @"Delete" forState: UIControlStateNormal];
}
【讨论】:
这是我使用的 Swift 版本:
func clickedEditButton(button: UINavigationItem) {
tableView.setEditing(!tableView.editing, animated: true)
if tableView.editing {
button.rightBarButtonItem?.title = "Done"
} else {
button.rightBarButtonItem?.title = "Edit"
}
}
【讨论】:
如果你想让你的按钮在蓝色的“完成”颜色和普通的“编辑”颜色之间切换,你可以将 rightBarButtonItem 设置为 UIBarButtonItemStyleDone 为蓝色,或 UIBarButtonItemStylePlain 为普通这样
self.navigationItem.rightBarButtonItem.style = UIBarButtonItemStyleDone;
【讨论】:
这被用于非 UITableViewController UIViewController 有一个到相关 UITableView 的出口的情况。
如上所述,您无法更改栏按钮项中的值,尤其是当它是系统项时。如果您愿意,您可以创建这两个项目并让它们在 ivars 中可用(如 UITableViewController)。不过,创建一个新的执行时间并不长,尤其是如果它可能永远不会被使用。
斯威夫特 5
@IBOutlet var table: UITableView!
@IBAction func toggleTableEdit(sender:UIBarButtonItem) {
table.setEditing(!table.isEditing, animated: true)
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: (table.isEditing) ? .done : .edit, target: self, action: #selector(toggleTableEdit(sender:)))
}
【讨论】:
@Nekto 的回答是正确的,您需要将此行添加到您的viewDidLoad 实现中:
navigationItem.leftBarButtonItem = editButtonItem
但是,这个新的“编辑”按钮不仅可以用于UITableViewController 的子类,还可以用于UIViewController 的任何子类。你只需要自己实现setEditing 方法。
例如,下面是它在带有 tableView 的 UIViewController 中的工作方式:
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
tableView.isEditing = editing // <-- toggle the tableView's editing mode
}
【讨论】: