Может кто-нибудь объяснить правильный способ подкласса UIViewController - PullRequest
2 голосов
/ 10 ноября 2010

Может ли кто-нибудь объяснить, как правильно создать подкласс UIViewController, а затем загрузить его в окно без использования пера.

Нужно ли устанавливать представление и когда мне это делать?loadView?

Мое приложение падает, когда я использую свой подкласс customUIViewController.Все загружается найти, пока я не нажму на кнопку, и это говорит о "Bad Access"

GettingStarted *vc = [[GettingStarted alloc] init];


UISplitViewController *split = self.splitViewController;
NSArray *vcArray = split.viewControllers;

NSLog(@"viewcontroll cout:%d", vcArray.count);

    // this line of code crashes my app. I fi comment it out everything works fine
UINavigationController *detailViewController = (UINavigationController*)[vcArray objectAtIndex:1];
//


detailViewController  pushViewController:vc animated:YES];


[vc release];

GettingStarted.m

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

[self.navigationItem setHidesBackButton:YES animated:YES];

//UIView *baseView = [[UIView alloc] init];

[[self navigationItem] setTitle:@"Getting Started"];

UIImageView *noUsersIV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no_users.png"]];

[noUsersIV setFrame:CGRectMake(0.0f, 0.0f, 466, 961.0f)];
[noUsersIV setHidden:NO];
[noUsersIV setTag:1006];
[[self view] addSubview:noUsersIV];
[noUsersIV release];


UIButton *btnAddUser = [UIButton buttonWithType:UIButtonTypeCustom];
[btnAddUser setImage:[UIImage imageNamed:@"no_users_button_standard.png"] forState:UIControlStateNormal];
[btnAddUser setImage:[UIImage imageNamed:@"no_users_button_activated.png"] forState:UIControlStateSelected];
[btnAddUser addTarget:self action:@selector(addUser:) forControlEvents:UIControlEventTouchUpInside];
[btnAddUser setFrame:CGRectMake(0, 428,466, 124)];


[[self view] addSubview:btnAddUser];

[btnAddUser release];


//self.view = baseView;

//[baseView release];

}

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Каков результат вашего сообщения журнала?Вы уверены, что в этом массиве> = 2 объекта?

Происходит ли сбой с помощью pushNavigationController в стеке вызовов или сбой происходит позже?

Вам также не нужно освобождатьsplit, vcArray или detailViewController.[Выпуск detailViewController], безусловно, вызовет сбой.Другие вызовут сбой позже.

Когда функции возвращают объекты, если вы не вызываете retain, или функция, возвращающая объект, называется alloc / copy / create , объект будет автоматически освобожденпоэтому вам не нужно его отпускать.

someArray = [NSArray arrayWithObjects:...]; // no need to release
someArray = someClass.array; // no need to release

someArray = [[NSArray alloc] init]; // alloc, need to release
someArray = [[NSArray arrayWithObjects:...] retain]; // retained, need to release

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

Обновление: у вас есть похожая проблема, когда вы добавляете кнопку.

1 голос
/ 10 ноября 2010

избавиться от этой строки кода

[btnAddUser release];

Этот объект 'btnAddUser' является частью пула автоматического выпуска, вы не должны вызывать release. Вам нужно только release/autorelease объекты, созданные или назначенные с помощью

alloc, copy, or retain
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...