iPhone故事板 编辑表格视图

9
我一直在尝试学习Xcode的新故事板功能,但在尝试将UITableView设置为编辑模式时遇到了问题。
到目前为止,我的故事板如下所示:
导航控制器 -> UIViewController(具有tableview属性)
我向视图控制器场景添加了一个导航项和一个栏按钮项,因此我确实看到了一个编辑按钮。它没有自动执行任何操作,因此我尝试将其选择器链接到tableview委托的setEditing方法。这确实将其放入编辑模式。但是,编辑按钮没有改变为“完成”按钮,因此无法退出编辑模式。
我是否需要为“完成”按钮创建另一个导航项?如何连接它以使其在正确的时间出现并正常工作?
7个回答

27

我认为,即使使用Storyboard,实现一个可用的编辑/完成按钮的唯一方法(肯定也是最简单的方法)就是使用以下代码:

- (void)viewDidLoad
{
[super viewDidLoad];
...
//set the edit button
self.navigationItem.leftBarButtonItem = self.editButtonItem;
...

如果您选择项目的“主控-详细信息应用程序”模板,则这是Apple自己实现的解决方案。

很可能Storyboard仍然不完美,希望在下一个版本中由Apple进行改进......


13
我刚开始使用Storyboards,所以我也想使用Storyboard来添加我的编辑按钮。很让人恼火的是,你花时间学习如何使用一种新工具,却发现需要一卷胶布来修补这些漏洞。
你可以让它起作用,但需要添加一个自定义按钮。在Attributes inspector中,确保标识符为Custom,标题为Edit。
然后在.m文件中添加类似以下内容:
- (IBAction)setEditMode:(UIBarButtonItem *)sender {
    if (self.editing) {
        sender.title = @"Edit";
        [super setEditing:NO animated:YES];
    } else {
        sender.title = @"Done";
        [super setEditing:YES animated:YES];
    } 
}

让您的自定义编辑按钮调用setEditMode方法。

只能希望在未来Storyboard编辑器中修复“编辑”按钮的实现。


1
六年过去了...它仍然没有被修复。 - gone

6

总结一下:

UIViewController.editButtonItem返回的按钮是一个特殊的切换按钮,具有特殊行为,如果按下,则调用- (void)setEditing:(BOOL)editing animated:(BOOL)animated

UINavigationController.editButtonItem返回的按钮只是一个标有“编辑”的简单按钮。

Storyboard允许选择后者。


5
如果您正在使用导航控制器来推送视图控制器,只需设置self.navigationItem.rightBarButtonItem = self.editButtonItem;,这将在右侧放置默认的“编辑”按钮。如果导航栏不可见,请调用self.navigationController.navigationBarHidden = NO;。这些应该在viewDidLoad方法或类似方法中调用。然后为了使tableView响应编辑调用,使用以下方法:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [tableView setEditing:editing animated:animated];
}

这应该可以做到你想要的。如果有任何问题,请说出来,我们可以缩小细节。


1
是的,我知道如何通过编程来实现它,但我一直在尝试通过Storyboard UI来完成它。 - markplee
应该基本相同。我也一直在使用Storyboard UI(我必须说这使得生活变得更加容易),并且不得不做类似的事情,这就是我处理它的方式。我注意到有时候你必须通过self.parentViewController.navigationItem.rightBarButtonItem = yourButton;来获取所需的视图层次结构。但只要你的tableView作为IBOutlet链接到viewController,其余部分应该保持不变。 - justin
有关此事是否有任何消息?一直在尝试如何使用新的Storyboard功能替换一个LOC。当然,仅仅将一个按钮放入导航栏并命名为“编辑”是不起作用的。;) - Sebastian Wramba
@SebastianWramba 你应该可以轻松地做到这一点。只需将其命名为“编辑”,然后分配一个IBAction方法,调用setEditing:animated:即可。个人而言,我会在特定的视图控制器的viewDidLoad方法中以编程方式创建它,使用self.navigationItem.rightBarButtonItem = self.editButtonItem。这样,您就不必分配一个方法(setEditing...),因为它是一个标准按钮项。希望这有意义。 - justin
1
没错,我猜重新发明轮子(或者在这种情况下将轮子放在别处)不是非常聪明的举动。虽然现在有故事板和Segue,但以传统方式实现“编辑”按钮似乎仍然是最好的方法。 - Sebastian Wramba

2

除了@Graham的回答之外,您可能还想更改样式,以便您可以拥有“完成”按钮样式(蓝色)。类似这样:

- (IBAction)setEditMode:(UIBarButtonItem *)sender {
    if (self.editing) {
        sender.title = @"Edit";
        sender.style = UIBarButtonItemStylePlain;
        [super setEditing:NO animated:YES];
    } else {
        sender.title = @"Done";
        sender.style = UIBarButtonItemStyleDone;
        [super setEditing:YES animated:YES];
    } 
}

1

可以使用Storyboard编辑器中的无效“编辑”按钮,然后以编程方式将其替换为UIViewController.editButtonItem

在viewDidLoad中:

 NSMutableArray *toolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems];

[toolbarItems replaceObjectAtIndex:0 withObject:self.editButtonItem];

[self setToolbarItems:toolbarItems];    

这段代码假设用户已经将“Edit”按钮添加为Storyboard工具栏上最左边的项目。


这有点取巧,但重新实现编辑按钮要更好。 - SeanR
使用代码替换您在Interface Builder中添加的按钮,以使其成为真正应该是的按钮似乎有点像黑客行为...但这是苹果的缺陷,迫使我们以这种方式进行操作。别误会,我认为这是最好的解决方案,除非Apple支持Interface Builder中实际的编辑按钮。 - SeanR
“hack" 究竟是什么?对我来说,这段代码距离“hack”还很远。如果那段代码能够越过系统或计算机中的数据获取未授权访问权限,那才算是“hack”,但这只是普通的编辑按钮样板... - manitu

1
假设您有一个UIViewController,并在其中添加了一个UITableVIew。如果您想添加一个编辑UIBarButton以便与UITableView进行交互,请尝试:
添加这一行...
- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    ...
}

和这个方法

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    [super setEditing:editing animated:animated];
    [self.myListTableView setEditing:editing animated:animated];

    if(self.myListTableView.editing) {
        NSLog(@"editMode on");
    } else {
        NSLog(@"editMode off");
    }
}

where

@property (weak, nonatomic) IBOutlet UITableView *myListTableView;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接