У меня есть контроллер навигации, встроенный в RootViewController. Элементы, присутствующие внутри RootViewController, представляют собой сегментированный элемент управления и UIView. Когда выбраны разные сегменты, UIView отображает соответствующий ViewController.Как сделать pushViewController: работать в следующем случае?
Теперь каждый из ViewController, отображаемый в UIView, является UITableViewController.
Мне нужно отобразить значения таблиц в соответствии с выборами сегмента. А также, если выбран какой-либо из строк таблицы, он должен перейти к более новому ViewController с подробным представлением.
Я могу отображать UITableViewControllers в соответствии с изменением сегмента. Однако, когда я нажимаю на строку таблицы, новый ViewController, который появляется, пуст (черный экран), хотя я создал конкретный ViewController в раскадровке и также установил идентификатор.
Код для изменения сегментированных управлений в ViewController.m
- (void)segmentedControlChangedValue:(UISegmentedControl*)segmentedControl {
int selIndex = segmentedControl.selectedIndex;
if (selIndex == 0)
{
aTable = [[aTableViewController alloc] init];
aTable.view.frame = self.myView.bounds;
[self.myView addSubview:aTable.view];
[self addChildViewController:aTable];
}
if (selIndex == 1)
{
bTable = [[bTableViewController alloc] init];
bTable.view.frame = self.myView.bounds;
[self.myView addSubview:bTable.view];
[self addChildViewController:bTable];
}
if (selIndex == 2)
{
//NSLog (@"Well you selected a 3rd option");
}}
Код для didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
newDetailController* newController = [self.storyboard instantiateViewControllerWithIdentifier:@"Detail"];
newController = [[newDetailController alloc] init];
[[self navigationController] pushViewController:newController animated:YES];}
pushViewController выталкивает пустой взгляд для меня, хотя я указал ViewController для использования в дизайне раскадровки, а также с использованием идентификатора.
Пожалуйста, помогите мне понять, что я должен сделать, чтобы исправить эту ошибку.
ОБНОВЛЕНИЕ - Проблема была решена.
Проблема, с которой я сталкиваюсь сейчас, не может получить доступ к данным в newViewController.
я передать данные в newViewController следующим образом:
Создать класс с именем NewClass, который содержит все элементы, которые я хочу, чтобы пройти через.
Создайте «newObjects» NSMutableArray в firstViewController.
Создайте каждый объект newClass при этом методе.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
static NSString *CellIdentifier = @"Cell";
customBigTableCell *cell = (customBigTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) { cell = [[customBigTableCell alloc] init]; }
cell.name.text = [object objectForKey:@"objName"];
newClass* newObj = [[newClass alloc] init];
newObj.objName = cell.name.text;
[newObjects addObject:newObj];
return cell; }
Pls pardon me .. для отступов с кодовым блоком перепутано ... Также PFObject - это то, что я использую Parse для базы данных.Добавить созданный объект в массив newObjects.
В методе
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
, это код(пустоты) Tableview: (UITableView *) Tableview didSelectRowAtIndexPath: (NSIndexPath *) indexPath { [супер Tableview: Tableview didSelectRowAtIndexPath: indexPath];
UIStoryboard * раскадровка = [UIStoryboard раскадровкаWithName: @ "MainStoryboard" комплект: [NSBundle mainBundle]];
новыйDetailController * новыйController = [раскадровка instantiateViewControllerWithIdentifier: @ "ПредстоящийDetail"];
obj = [[newClass alloc] init];
NSIndexPath * path = [self.tableView indexPathForSelectedRow];
obj = [newObjects objectAtIndex: path.row];
NSLog (@ "Row selected is% ld", (long) path.row); // это возвращает правильную строку, выбранную
NSLog (@ "Movie selected is% @", [[newObjects objectAtIndex: path.row] objName]); // однако это неверно по методу cellForRowAtIndexPath ,
[новыйController setNewObj: obj];
[[self navigationController] pushViewController: newController animated: YES]; }
При запуске этого кода, строка выбрана правильно. Однако я не получаю соответствующую строку в базе данных. Массив хранится с избыточными данными.
Спасибо @rdelmar. Однако, когда я удаляю этот оператор, я получаю следующую ошибку ... Приложение попыталось нажать на контроллер представления nil на цель –
AJoseph
Кроме того, я проверил аналогичные вопросы, и они попросили меня не переопределять - (void) loadView. Тем не менее, у меня нет этого метода, переопределенного в моей программе. – AJoseph
@AJoseph, если вы получаете эту ошибку, то по какой-то причине строка выше не возвращает контроллер вида. Вы должны зарегистрировать как newController, так и self.storyboard, чтобы узнать, что равно нулю. Кроме того, вы, вероятно, не должны переопределять loadView - почему вы это делаете? – rdelmar