在另一个ViewController

时间:2015-10-21 20:34:47

标签: ios objective-c uitableview uiviewcontroller edit

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

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

感谢。

更新:解决方案

我已经接受了@ sebastien的解决方案,尽管@ sebastien&@ Bagrat的解决方案都很有效。 @Bagrat的答案包括直接访问表格视图控制器,而@ sebastien的解决方案在pageViewController中调用编辑模式。我认为,考虑到棘手的等级制度,后者更安​​全一些。

2 个答案:

答案 0 :(得分:1)

以下是我的View Controller的代码完全正常。确保使用View Controller生命周期的正确方法配置条形按钮。还要确保您的代码中正确实现了@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

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

UINavigationController > UIPageViewController > UIViewController(s)

UITableView中使用UIViewController而不是使用真正死亡的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]时,你每次都重新制作相同的表视图控制器,但是甚至没有将它添加到你的主要观点。正如我告诉你的那样,你棘手的等级可能会带来困难,但它有一个解决方案。

在.h文件中的PageViewController.m制作 tv1 tv2 属性中,就像这样。

@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,您每次都不会重新创建视图,但是您会捕获当前视图控制器中已有的视图。

祝你好运!

答案 1 :(得分:1)

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

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

  • 您通过故事板生成的那个
  • 您在代码中进一步启动的另一个

这就是为什么你无法达到预期的结果。

首先,为PageViewController添加新方法:

PageViewController.h:

- (void)editTableAtIndex:(int)index;

PageViewController.m:

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

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

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

应该修改您的TodoListTableView

enter image description here

(请注意我使用了[pvc editTableAtIndex:0];,而应该调用类似[pvc editTableAtIndex:_PageViewController_current_index_];的内容