2015-10-21 4 views
-1

У меня есть ViewController (с видом контейнера), встроенный в контроллер навигации. Контейнер содержит pageViewController с одной из «страниц», которая является TableViewController (с выходом UITableView: «aTableView»). Я хочу вызвать режим редактирования в tableViewController, когда вы нажимаете пользовательскую кнопку editButton на панели навигации. Когда я создаю настраиваемый editutton в tableViewController, режим редактирования работает так, как ожидалось, но когда я использую пользовательский editButton в навигационной панели, значение setooling bool остается равным нулю, даже когда я устанавливаю Editing в YES в селекторе editButton. Вот код:Переключить режим редактирования в другой ViewController

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 Киракосян указал мне, что моя точка зрения иерархии (Navigation Controller> View Controller (с containter)> Page View Controller (в контейнере)> Table View Controller) может быть проблема. Я просто хочу создать панель навигации (с кнопкой редактирования), которая исправлена, поэтому я не могу встроить контроллер табличного представления непосредственно в контроллер навигации.

Спасибо.


UPDATE: Решение

я принял @ решение Себастьен в хотя оба @ Себастьен х и @ решения работе Баграта большой. Ответ Баграта включает прямой доступ к контроллерам табличного представления, а решение @ sebastien вызывает режим редактирования в pageViewController. Я думаю, что, учитывая сложную иерархию, последняя немного более безопасна.

+0

Вы должны предоставить больше своего кода, особенно нам нужно посмотреть, как вы реализуете свой 'UITableView' и ваш editButton' –

+0

. Я обновил некоторые примеры кода. – Baekel

+0

Попробуйте изменить 'if (something == foo)' с 'if (true)' –

ответ

1

Итак, ваша проблема заключается в том, что вы пытаетесь получить доступ к встроенному контроллеру неправильно.

Вы на самом деле управление 2 Differents PageViewController:

  • одной вы сгенерировали через раскадровку
  • Другие вы инициирование в коде дальнейшего

Вот почему вы не можете достичь ожидаемого результата.

Прежде всего, добавить новый метод к вашему PageViewController:

PageViewController.h:

- (void)editTableAtIndex:(int)index; 

PageViewController.м:

- (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_];)

+0

Все еще не работает. А журнал aTableView.editing по-прежнему нет? – Baekel

+0

Можете ли вы предоставить свои источники, я проверю их и верну несколько советов, КАК МОЖНО СКОРЕЕ –

+0

https://github.com/sennevanbaelen/ToDoApp. Поскольку я только начал изучать ObjC/какао три недели назад, я должен предупредить вас, что код выглядит очень грязным. Я просто экспериментировал с некоторыми функциями и API какао. – Baekel

1

Вот код моего контроллера View, который полностью работает нормально. убедитесь, что вы настроили кнопку панели в правильном методе жизненного цикла 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]; 
} 

UPDATE 1

A Если вы заметите, что у нас есть еще один вопрос. Проблема заключается не в той части, где вы пытаетесь вызвать редактирование toggle. Ваша проблема - неправильная иерархия контроллеров. (Контроллер навигации> Контроллер просмотра> Контроллер просмотра страницы> Контроллер таблицы). Это может вызвать проблемы.Попытайтесь изменить свои контроллеры следующим образом;

UINavigationController > UIPageViewController > UIViewController(s) 

Кроме того, это хорошая практика, чтобы иметь UITableView в UIViewController, а не с использованием действительно мертвое UITableViewController. Не забудьте подключить ваш TableView IBOutlet (кстати, он вам не нужен в UITableViewController), также подключите datasource и delegate к владельцу файлов. В файле MyTableViewVC.h добавьте эту строку

@interface MyTableViewVC : UIViewController <UITableViewDataSource, UITableViewDelegate> 

После этого все ваши звонки будут работать нормально.


UPDATE 2

Проанализировав всю вашу структуру я нашел ошибку, что вы делаете каждый раз, когда на кнопку мыши.

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

При вызове раскадровка каждый раз, это нормально, но когда вы делаете [[TodolistTableViewController alloc] init] вы RE-ИЗГОТОВЛЕНИЕ тот же контроллер табличное каждый раз, но даже не добавляя его в главном окне. Как я уже говорил, ваша сложная иерархия может вызвать трудности, но у нее есть решение.

В вашей PageViewController.m сделать tv1 и TV2 свойства в файле .h, как так.

@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 вы не заново создаете свои взгляды каждый раз, но вы улавливаете те, что у вас уже есть в текущем контроллере View.

Удачи!

+0

Вот как я его реализовал. Я редактировал свой пост, предоставляя больше кода. – Baekel

+0

@ Baekel, можете ли вы объяснить мне свою правильную иерархию? У вас может быть что-то вроде этого (Контроллер навигации> Контроллер просмотра> Контроллер просмотра страницы> Контроллер таблицы). Объясните еще, что вы там сделали? –

+0

Возможно, это проблема. Моя иерархия такова: Контроллер навигации> Контроллер просмотра (с контейнером)> Контроллер просмотра страницы (в контейнере)> Контроллер табличного представления. Я сначала встроил TableViewController в контроллер навигации, но затем Nav Con является частью страницы, и я хотел, чтобы это было исправлено ... – Baekel

Смежные вопросы