【问题标题】:UITableView Edit/Done ButtonUITableView 编辑/完成按钮
【发布时间】:2011-09-12 09:33:13
【问题描述】:

如何在导航栏上实现一个按钮,以便用户能够重新排序和删除 UITableView 的行?

我是否必须创建自己的工具栏按钮才能为我的 UITableView 创建编辑/完成按钮?

【问题讨论】:

    标签: iphone uitableview


    【解决方案1】:

    只需在您的UITableViewControllerviewDidLoad 中添加这一行

    self.navigationItem.leftBarButtonItem = self.editButtonItem;
    

    如果您的表视图超级视图是UINavigationController,它将起作用。此行将添加按钮,该按钮将在编辑模式下推送表格并退出表格。

    【讨论】:

    • 我试过了,虽然按钮在那里,但它不会推动我的 tableView 进入和退出编辑模式。有没有我必须处理的代表回电?
    • 你的视图控制器是 uitableviewcontroller 的子类
    • 我刚刚让我的 ViewController 成为 UITableViewController 的子类,它就可以工作了。但是如何实现允许用户重新排列行的功能呢?
    • 现在一切正常。我需要设置cell.showsReorderControl = TRUE; 并实现- (BOOL)tableView:(UITableView *)tableview canMoveRowAtIndexPath:(NSIndexPath *)indexPath & - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 方法
    • 如果我的回答帮助你解决了问题,别忘了接受。 TY
    【解决方案2】:

    通常做的是创建自己的自定义 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"];  
    }
    

    【讨论】:

      【解决方案3】:
      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];
      }
      

      【讨论】:

        【解决方案4】:

        这是我使用的 Swift 版本:

        func clickedEditButton(button: UINavigationItem) {
            tableView.setEditing(!tableView.editing, animated: true)
        
            if tableView.editing {
                button.rightBarButtonItem?.title = "Done"
            } else {
                button.rightBarButtonItem?.title = "Edit"
            }
        }
        

        【讨论】:

          【解决方案5】:

          如果你想让你的按钮在蓝色的“完成”颜色和普通的“编辑”颜色之间切换,你可以将 rightBarButtonItem 设置为 UIBarButtonItemStyleDone 为蓝色,或 UIBarButtonItemStylePlain 为普通这样

          self.navigationItem.rightBarButtonItem.style = UIBarButtonItemStyleDone;
          

          【讨论】:

            【解决方案6】:

            确保您需要先初始化标题。通过故事板,

            之后,

            @IBAction func editBtnPressed(_ sender: UIBarButtonItem) {
                    tableView.setEditing(!tableView.isEditing, animated: true)
            
                    if tableView.isEditing {
                        self.editButton.title = "Done"
                    } else {
                        self.editButton.title = "Edit"
                    }
                }
            

            【讨论】:

              【解决方案7】:

              这被用于非 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:)))
              }
              

              【讨论】:

                【解决方案8】:

                @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
                }
                

                【讨论】:

                  猜你喜欢
                  • 2011-07-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-04-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多