Редактирование таблицы в приложении с вкладками

87
1

У меня есть приложение с вкладками, которое использует контроллер табуляции в качестве контроллера корневого представления. Один из видов, которые у меня есть, - это табличное представление, в котором я хочу иметь возможность редактировать, нажав кнопку добавления/редактирования, которая сделает все ячейки редактируемыми, а также позволит добавить ячейку.

В представлении таблицы я добавил панель навигации и попытался использовать следующий код, чтобы создать кнопку на панели, которая при нажатии сделает все ячейки доступными для редактирования:

- (void)viewDidLoad {
[super viewDidLoad];

UIBarButtonItem *editButton = [[UIBarButtonItem alloc]
initWithTitle:@"Delete"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(toggleEdit:)];
self.navigationItem.rightBarButtonItem = editButton;

}

-(IBAction)toggleEdit:(id)sender {

[self.mTableView setEditing:!self.mTableView.editing animated:YES];

if (self.mTableView.editing)
[self.navigationItem.rightBarButtonItem setTitle:@"Done"];
else
[self.navigationItem.rightBarButtonItem setTitle:@"Delete"];

}

Код не работает, он не создает кнопку на панели навигации. Я прочитал, что должен использовать контроллер навигации, но если я хочу, чтобы эта одна страница (в моем приложении с вкладками) использовала контроллер навигации, как мне заставить панель вкладок указывать на контроллер навигации в качестве опции выбора?

---- Обновление ----- Ok Ive создал файл nib, содержащий контроллер корневого представления (контроллер панели вкладок). Контроллер панели вкладок содержит 2 контроллера вида и контроллер навигации с контроллером представления в нем. Я связываю контроллер View в контроллере навигации с представлением, содержащим представление таблицы. Когда я запускаю программу и пытаюсь щелкнуть вкладку таблицы, я получаю следующую ошибку:

2012-04-29 17: 23: 28.116 ash [6778: f803] - [UIViewController tableView: numberOfRowsInSection:]: непризнанный селектор отправлен в экземпляр 0x68bb8d0 2012-04-29 17: 23: 28.117 ash [6778: f803] * Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: '- [UIViewController tableView: numberOfRowsInSection:]: нераспознанный селектор, отправленный в экземпляр 0x68bb8d0'

Контроллер моего представления, содержащий табличное представление, - это UIViewController, который реализует

В своем файле m он содержит следующие методы:

    #pragma mark -
#pragma mark Table View Data Source Methods

- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.portfolioArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *SimpleTableIdentifier = @"CellTableIdentifier";
static BOOL nibsregistered = NO;
if (!nibsregistered) {
UINib *nib = [UINib nibWithNibName:@"ASHInstrumentCell" bundle:nil];
[tableView registerNib:nib forCellReuseIdentifier:SimpleTableIdentifier];
nibsregistered = YES;
}

ASHInstrumentCell *cell = [tableView dequeueReusableCellWithIdentifier:
SimpleTableIdentifier];

NSUInteger row = [indexPath row];

cell.type.text = [portfolioArray objectAtIndex:row];

return cell;
}

#pragma mark -
#pragma mark Table Delegate Methods

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSString *rowValue = [portfolioArray objectAtIndex:row];

NSString *message = [[NSString alloc] initWithFormat:
@"You selected %@", rowValue];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Row Selected!"
message:message
delegate:nil
cancelButtonTitle:@"Yes I Did"
otherButtonTitles:nil];
[alert show];

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
NSUInteger row = [indexPath row]
[self.portfolioArray removeObjectAtIndex:row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic] ;
}

Что я делаю не так?

спросил(а) 2021-01-25T10:50:30+03:00 4 месяца, 3 недели назад
1
Решение
116

Хорошо, я думаю, что понял, что я делаю неправильно. Я создал файл nib для моего контроллера представления вкладок, и к этому я добавил к контроллерам просмотра и контроллеру навигации (который сам содержал контроллер таблицы).

Одной из вещей, которые я не делал, было выделение правильного типа класса для контроллеров представления на моих вкладках. Если я создал настраиваемый контроллер класса firstviewcontroller, который имел IBOutlets, и я не указал контроллер представления в моем контроллере табуляции, чтобы быть из класса firstviewcontroller, я бы получил эту странную ошибку значения ключа.

Вторая проблема, с которой я столкнулся, заключалась в том, что контроллер представления табуляции не будет авторотировать, хотя все представление, которое я хотел показать, разрешено для авторотации с использованием следующего кода:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return YES;
}

Причина этого снова заключалась в том, что я не указывал класс каждого из контроллеров представлений (в моем файле nib файла tabbedviewcontroller), чтобы быть из моих специальных классов, которые я хотел им показать.

Как только я определил их тип класса, все встало на свои места.

ответил(а) 2021-01-25T10:50:30+03:00 4 месяца, 3 недели назад
45

Два момента: во-первых, UINavigationController является подклассом UIViewController, поэтому вы можете создать экземпляр UINavigationController, rootViewController которого является вашим TableViewController, и TabBarController управляет контроллером nav как один из его вкладок.

Также обратите внимание, что класс UIViewController уже имеет свойство editButtonItem которое вы должны использовать вместо создания своей собственной кнопки:

 self.navigationItem.rightBarButtonItem = self.editButtonItem;

ответил(а) 2021-01-25T10:50:30+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема