我在导航控制器中嵌入了一个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中调用编辑模式。我认为,考虑到棘手的等级制度,后者更安全一些。
答案 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中不需要它的方式),也将datasource
和delegate
连接到文件所有者。在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
:
(请注意我使用了[pvc editTableAtIndex:0];
,而应该调用类似[pvc editTableAtIndex:_PageViewController_current_index_];
的内容