UIViewController не загружает UIView - PullRequest
0 голосов
/ 03 марта 2010

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

Файлы:

  • SubViewOneController (который является вложенным представлением, также имеет перо)
  • TapViewController (пользовательский UIView, который я создал и хочу добавить в ячейку)
  • RootViewController (Основной контроллер, который загружается в представлениях)
  • SimpleNavAppDelegate

Как это работает: в RootViewController есть NSArray, содержащий объекты NSDictionary, который объявлен в методе - (void) awakeFromNib {}

- (void)awakeFromNib {

// we'll keep track of our views controllers in this array
views = [[NSMutableArray alloc] init];      // when using alloc you are responsible for it, and you will have to release it.

// ====================================================================================================
// ====================================================================================================

// LOADING IN CUSTOM VIEW HERE:

// allocate a set of views and add to our view array as a dictionary item
TapViewController *tapBoardView = [[TapViewController alloc] init]; 

//push onto array
[views addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                  @"Tab Gestures",      @"title",
                  tapBoardView,         @"controller",
                  nil]];

[tapBoardView release]; //release the memory

// ====================================================================================================
// ====================================================================================================

SubViewOneController *subViewOneController = [[SubViewOneController alloc] init];

// This will set the 2nd level title
subViewOneController.title = @"Swipe Gestures"; //set it's title

//push it onto the array    
[views addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                  @"Swipe Gestures",    @"title",
                  subViewOneController, @"controller",
                  nil]];

[subViewOneController release]; //release the memory

}

Позже я установлю вид таблицы:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// OUTPUT -- see console
NSLog(@"indexPath %i", indexPath.row);  // OUTPUT: tapController: <TapViewController: 0x3b2b360>
NSLog(@"view object: %@", [views objectAtIndex:indexPath.row]); // OUTPUT: view object: controller = <TapViewController: 0x3b0e290>; title = "Tab Gestures";

// ----- Hardcoding the controller and nib file in does work, so it's not a linkage issue ------
// UNCOMMENT TO SEE WORKING -- comment below section.
//TapViewController *tapContoller = [[TapViewController alloc] initWithNibName:@"TapBoardView" bundle:nil];
//NSLog(@"tapController: %@", tapContoller); 
//[self.navigationController pushViewController:tapContoller animated:YES];

// ----- Random Tests -----
//UIViewController *targetViewController = [[views objectAtIndex: 0] objectForKey:@"controller"];       // DOES NOT WORK

// LOADS THE SECOND CELL (SubViewOneController) however will not load (TapViewController)
UIViewController *targetViewController = [[views objectAtIndex: indexPath.row] objectForKey:@"controller"];
NSLog(@"target: %@", targetViewController); // OUTPUT: target: <TapViewController: 0x3b0e290>

[self.navigationController pushViewController:targetViewController animated:YES];   

}

Читая комментарии, вы должны увидеть, что жесткое кодирование представления работает, однако попытка загрузить его из View NSArray не работает. Однако он содержит объект в памяти, видя, что NSLog доказывает это.

Все связано и работает в файле пера TapViewController. Так что, я вроде бы застрял на этом, любая помощь будет отличной!

Спасибо, ребята

1 Ответ

0 голосов
/ 12 марта 2010

Вы используете неправильный метод инициализации для TapViewController вверху. Обычный старый init на контроллере представления не собирается загружать перо. И если предположить, что ваше перо правильно подключено (как вы говорите), если вы не загружаете перо, свойство view контроллера представления никогда не будет установлено на что-либо. Таким образом, свойство view равно нулю. Таким образом, ваш контроллер представления не имеет никакого представления, чтобы показать, когда ваше приложение использует его.

TapViewController *tapBoardView = [[TapViewController alloc] init];

Принимая во внимание, что вы используете правильный в своем «жестко закодированном» разделе:

TapViewController *tapContoller = [[TapViewController alloc] initWithNibName:@"TapBoardView" bundle:nil];
...