Приложение iOS вылетает при нажатии кнопки с NavigationController - PullRequest
0 голосов
/ 02 марта 2012

Я новичок в 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!");
}

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

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

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

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Я только что решил это. Мне пришлось вставить свойство в 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;
}

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

0 голосов
/ 02 марта 2012

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

...