【问题标题】:Toggle edit mode in another ViewController在另一个 ViewController 中切换编辑模式
【发布时间】:2015-10-21 20:34:46
【问题描述】:

我在导航控制器中嵌入了一个 ViewController(带有容器视图)。该容器包含一个 pageViewController,其中一个“页面”是 TableViewController(带有 UITableView 出口:“aTableView”)。我想在导航栏中点击自定义编辑按钮时触发 tableViewController 中的编辑模式。当我在 tableViewController 中创建自定义 editutton 时,编辑模式按预期工作,但是当我在导航栏中使用自定义 editButton 时,即使我在 editButton 选择器中将 setEditing 设置为 YES,setEditing 布尔值仍然为零。代码如下:

ViewController.m

-(void)viewDidLoad {
    self.editBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.editBtn setFrame:CGRectMake(0, 0, 40, 22)];
    [self.editBtn addTarget:self action:@selector(goToToggleEdit:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *editButton=[[UIBarButtonItem alloc]initWithCustomView:self.editBtn];
    self.navigationItem.rightBarButtonItem = editButton;

}

-(void)goToToggleEdit:(id)sender
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    TableViewController *tvc = [storyboard instantiateViewControllerWithIdentifier:@"aTableViewController"];
    if(something==foo){
        [tvc toggleEdit];
     }
}

aTableViewController.h

@interface aTableViewController : UITableViewController <UITextFieldDelegate> {

    IBOutlet UITableView *aTableView;

}

-(void) toggleEdit ;

@end

aTableViewController.m

-(void)toggleEdit {
    [aTableView setEditing:YES animated:YES];
    NSLog(aTableView.editing ? @"Yes" : @"No");  // --> logss 'No'.
    if (aTableView.editing){
        //do something
    }
    else {
        //do something else 
    }
}

我怎样才能以这种方式有效地触发 tableViewController 中的编辑模式?

编辑
@Bagrat Kirakosian 向我指出我的视图层次结构(导航控制器 > 视图控制器(带有容器)> 页面视图控制器(在容器中)> 表视图控制器)可能是问题所在。我只想创建一个固定的导航栏(带有编辑按钮),因此我不能将表格视图控制器直接嵌入导航控制器中。

谢谢。


更新:解决方案

我接受了@sebastien 的解决方案,尽管@sebastien 和@Bagrat 的解决方案都很好用。 @Bagrat 的答案包括直接访问 Table View Controller,而 @sebastien 的解决方案在 pageViewController 中调用编辑模式。我认为,考虑到棘手的层次结构,后者更安​​全一些。

【问题讨论】:

  • 你应该提供更多你的代码,特别是,我们需要看看你是如何实现你的UITableView和你的editButton
  • 检查编辑。我更新了一些示例代码。
  • 尝试将if(something==foo) 更改为if(true)
  • 已经试过了,没有成功。检查aTableViewController.m,log = NO。

标签: ios objective-c uitableview uiviewcontroller edit


【解决方案1】:

这是我的视图控制器的代码,完全可以正常工作。确保在 View Controller 生命周期的正确方法中配置你的 bar 按钮。还要确保您的 @selector 在您的代码中正确实现。

在同一个 View Controller 中放这两段代码

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIBarButtonItem *rightBarButton = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"edit_icon.png" ] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] style:UIBarButtonItemStylePlain target:self action:@selector(edit:)];
    [rightBarButton setTintColor:[UIColor whiteColor]];
    self.navigationItem.rightBarButtonItem =  rightBarButton;
}

之后你还需要放置你的编辑选择器

-(void)edit:(UIButton *)sender {
    // Toggle edit by inverting current edit state
    // Also in this block change your right bar button text or image
    [self.tableView setEditing:!self.tableView.editing animated:YES];
}

更新 1

在您发表评论后,我们又提出了另一个问题。您的问题不在您尝试调用切换编辑的部分。您的问题是控制器层次结构错误(导航控制器 > 视图控制器 > 页面视图控制器 > 表视图控制器)。这可能会导致问题。尝试像这样更改您的控制器;

UINavigationController > UIPageViewController > UIViewController(s)

另外,在UIViewController 中使用UITableView 而不是使用真正死掉的UITableViewController 也是一个好习惯。不要忘记连接您的 tableView IBOutlet(顺便说一下,您在 UITableViewController 中不需要它),还将 datasourcedelegate 连接到文件所有者。在您的 MyTableViewVC.h 文件中添加这一行

@interface MyTableViewVC : UIViewController <UITableViewDataSource, UITableViewDelegate>

之后,您的所有通话都会正常工作。


更新 2

在分析了您的整个结构后,我发现您每次单击按钮时都会犯的错误。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
tvc = [[TodolistTableViewController alloc] init];

当你每次调用故事板时都可以,但是当你调用 [[TodolistTableViewController alloc] init] 时,你每次都重新制作同一个表视图控制器,但甚至没有将它添加到你的主视图中。正如我告诉你的,你棘手的层次结构可能会造成困难,但它有一个解决方案。

在您的PageViewController.m 中,在 .h 文件中创建 tv1tv2 属性,如下所示。

@property (strong, nonatomic) UITableViewController *tv1;
@property (strong, nonatomic) UITableViewController *tv2;

然后在视图控制器文件中执行此操作

-(void)toggleEdit:(id)sender
{


    PageViewController *current = (PageViewController *)[[self childViewControllers] firstObject];

    if ([current isKindOfClass:[PageViewController class]])
    {
        [((TodolistTableViewController *)[current tv1]) toggleEdit];
    }

}

Answer 包括所有安全检查和对表视图控制器的直接访问,因为您以后可能需要更改其他属性/调用函数。

现在在 -(void)toggleEdit:(id)sender 中,您不会每次都重新创建视图,但您会捕获当前视图控制器中已有的视图。

祝你好运!

【讨论】:

  • 这基本上就是我实现它的方式。我编辑了我的帖子,提供了更多代码。
  • @Baekel 你能解释一下你的正确层次结构吗?你不能有这样的东西(导航控制器>视图控制器>页面视图控制器>表视图控制器)。详细说明你在那里做了什么?
  • 那可能是问题所在。我的层次结构是这样的:导航控制器 > 视图控制器(带有容器)> 页面视图控制器(在容器中)> 表视图控制器。我首先将 TableViewController 嵌入到 Navigation Controller 中,但 Nav Con 是页面的一部分,我希望将其修复...
  • @Baekel 请查看更新 1 并提供您的源文件。
  • 检查编辑。我添加了源代码。请注意,这仍然是错误的视图层次结构。我现在将尝试您的更新解决方案。
【解决方案2】:

好的,您的问题是您试图以错误的方式访问嵌入式控制器。

您实际上是在管理 2 个不同的 PageViewController

  • 您通过情节提要生成的那个
  • 您在代码中进一步启动的另一个

这就是你无法达到预期结果的原因。

首先,给你的PageViewController添加一个新方法:

PageViewController.h:

- (void)editTableAtIndex:(int)index;

PageViewController.m:

- (void)editTableAtIndex:(int)index {
    [[self viewControllerAtIndex:index] setEditing:YES];
}

现在,在您的主 ViewController 中,使用 childViewControllers 访问 PageViewController

-(void)toggleEdit:(id)sender
{
    PageViewController *pvc = self.childViewControllers[0];
    [pvc editTableAtIndex:0];
}

应该是编辑你的TodoListTableView:

(请注意我使用了[pvc editTableAtIndex:0];,而不是你应该调用类似[pvc editTableAtIndex:_PageViewController_current_index_];

【讨论】:

  • 还是不行。而且aTableView.editing的日志还是没有?
  • 你能提供你的资源吗,我会检查它们并尽快给你一些建议
  • github.com/sennevanbaelen/ToDoApp。由于我三周前刚开始学习 ObjC/cocoa,我不得不警告你,代码看起来很乱。我只是在试验一些函数和 cocoa API。
  • @Baekel,我根据您的消息来源编辑了答案。
  • 不客气,别忘了[pvc editTableAtIndex:_PageViewController_current_index_]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多