Ios 在另一个ViewController中切换编辑模式

Ios 在另一个ViewController中切换编辑模式,ios,objective-c,uitableview,uiviewcontroller,edit,Ios,Objective C,Uitableview,Uiviewcontroller,Edit,我在导航控制器中嵌入了一个ViewController(带有容器视图)。容器包含一个pageViewController,其中一个“页面”是TableViewController(带有UITableView出口:“aTableView”)。我想在点击导航栏中的自定义编辑按钮时触发tableViewController中的编辑模式。当我在tableViewController中创建自定义编辑按钮时,编辑模式按预期工作,但当我在导航栏中使用自定义编辑按钮时,即使在编辑按钮选择器中将编辑设置为“是”,

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

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];
     }
}
-(void)toggleEdit {
    [aTableView setEditing:YES animated:YES];
    NSLog(aTableView.editing ? @"Yes" : @"No");  // --> logss 'No'.
    if (aTableView.editing){
        //do something
    }
    else {
        //do something else 
    }
}
aTableViewController.h

@interface aTableViewController : UITableViewController <UITextFieldDelegate> {

    IBOutlet UITableView *aTableView;

}

-(void) toggleEdit ;

@end
如何以这种方式有效地触发tableViewController中的编辑模式

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

谢谢


更新:解决方案


我已经接受了@sebastien的解决方案,尽管@sebastien和@Bagrat的解决方案都很有效@Bagrat的答案包括直接访问表视图控制器,而@sebastien的解决方案调用pageViewController中的编辑模式。我认为,考虑到复杂的层次结构,后者更安全一些

下面是我的视图控制器的代码,它完全可以正常工作。请确保使用查看控制器生命周期的正确方法配置条形图按钮。还要确保在代码中正确实现了@selector

在同一视图中,控制器放置这两个代码块

-(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中不需要它),还要将
数据源
委托
连接到文件所有者。在MyTableViewVC.h文件中添加以下行

@interface MyTableViewVC : UIViewController <UITableViewDataSource, UITableViewDelegate>
每次调用情节提要都可以,但每次调用
[[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];
    }

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

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


祝你好运

下面是我的视图控制器的代码,它完全可以正常工作。请确保使用查看控制器生命周期的正确方法配置条形图按钮。还要确保在代码中正确实现了@selector

在同一视图中,控制器放置这两个代码块

-(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中不需要它),还要将
数据源
委托
连接到文件所有者。在MyTableViewVC.h文件中添加以下行

@interface MyTableViewVC : UIViewController <UITableViewDataSource, UITableViewDelegate>
每次调用情节提要都可以,但每次调用
[[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];
    }

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

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


祝你好运

下面是我的视图控制器的代码,它完全可以正常工作。请确保使用查看控制器生命周期的正确方法配置条形图按钮。还要确保在代码中正确实现了@selector

在同一视图中,控制器放置这两个代码块

-(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;
}
之后你还需要把你