Приложение iOS аварийно завершает работу при нажатии кнопки с NavigationController

Я новичок в objective-c, и в настоящее время я работаю над приложением для iOS. У меня есть кнопка, которую я вызываю SettingsButton, которая находится внутри пользовательского объекта UIView. Когда я нажимаю эту кнопку, вызывается обработчик Touch Up Inside для FileOwner «ViewController.m», который позже подтолкнет ViewController к NavigationController. Но приложение вылетает с SIGABRT или EXC_BAD_ACCESS. Это происходит с тех пор, как я вставил код с NavigationController в AppDelegate.m. Есть идеи?

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *vc;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    vc = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
    vc = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}

UINavigationController* navController =
[[UINavigationController alloc] initWithRootViewController:vc];
navController.navigationBarHidden = true;
[self.window addSubview:navController.view];

[self.window makeKeyAndVisible];
return YES;
}

ViewController.m:

- (IBAction)SettingsPressed:(id)sender {
NSLog(@"SettingsPressed!");
}

Чтобы прояснить: я намерен только изменить представление при нажатии кнопки SettingsButton и наличии кнопки Back для возврата. Но приложение уже вылетает с пустым обработчиком событий.

Сообщение об ошибке при появлении sigabrt:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString SettingsPressed:]: unrecognized selector sent to instance 0x7a06fc0'

person Marv    schedule 02.03.2012    source источник
comment
Можешь поставить строчку где вылетает?   -  person Antonio MG    schedule 02.03.2012
comment
Я только что добавил сообщение об ошибке с консоли. Надеюсь, это то, что вы имели в виду.   -  person Marv    schedule 02.03.2012
comment
Хорошо, я подхожу ближе, могу я увидеть фрагмент кода, в котором вы вызываете SettingsPressed   -  person Antonio MG    schedule 02.03.2012
comment
Вы передали settingsPressed не тот объект. Выяснить, где вы это сделали, было бы проще, если бы вы включили трассировку.   -  person Hot Licks    schedule 02.03.2012
comment
Спасибо за вашу помощь. SettingsPressed - это IBAction, который связан с событием Touch Up Inside для моей кнопки. Поскольку я новичок в этом: как включить трассировку?   -  person Marv    schedule 02.03.2012


Ответы (2)


Я только что решил это. Мне пришлось вставить свойство в AppDelegate.h и синтезировать его в AppDelegate.m, а затем отредактировать его следующим образом:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
UIViewController *vc;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    vc = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
    vc = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}

_navController = [[UINavigationController alloc] initWithRootViewController:vc];
_navController.navigationBarHidden = true;
[self.window addSubview:_navController.view];
[self.window makeKeyAndVisible];
return YES;
}

Такая маленькая ошибка с таким большим эффектом. Но я действительно не знаю, почему мой код выше вызывает ошибку. Может кто уточнить?

person Marv    schedule 02.03.2012

Конечно, вы отправляете сообщение не тому объекту, выполните поиск в своем коде, чтобы увидеть, отправляете ли вы сообщение SettingsPressed напрямую в NSString, и проверьте, правильно ли вы установили соединение в построителе интерфейса. Вы также можете отправить отладчик po addressOfCrashingInstance, чтобы получить дополнительную информацию.

person Andrea    schedule 02.03.2012
comment
Я действительно не знаю, как это отладить. в консоли, когда я набираю po addressOfCrashingInstance, я получаю error: use of undeclared identifier 'addressOfCrashingInstance' error: 1 errors parsing expression Соединение в построителе интерфейса должно быть в порядке. - person Marv; 02.03.2012
comment
Я имел в виду заменить слово addressOfCrashingInstance на адрес вашего экземпляра, показанный в отладчике, например po 0x7a06fc0 - person Andrea; 03.03.2012