self.parentViewController регистрирует UINavigationController, но действует как UIViewController - PullRequest
0 голосов
/ 09 октября 2011

Код:

- (IBAction)continueTouchHandler:(id)sender {
  RegistrationViewController *registration = [[RegistrationViewController alloc] initWithNibName:@"RegistrationView" bundle:nil];
  UINavigationController *navController = (UINavigationController *)self.parentViewController;  
  [navController pushViewController:registration animated:YES];

  [navController release]; 
  [registration release]; 
}

Вызывается для UIButton TouchUpInside.

NSLog(@"%@", self.parentViewController) журналов a UINavigationController, но без ввода типовself.parentViewController как UINavigationController Я получаю следующее предупреждение от Xcode: Incompatible pointer types initializing 'UINavigationController *' with an expression of type 'UIViewController *'

Я предполагаю, что получаю предупреждение, потому что Xcode думает, что self.parentViewController - это UIViewController.Именно тогда я решил, что мне нужно «набрать тип» (я не использую xcode / ios dev).

Трассировка трека перед типизацией:

GNU gdb 6.3.50-20050815 (Apple version gdb-1518) (Sat Feb 12 02:52:12 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".sharedlibrary apply-load-rules all
Attaching to process 99533.
Current language:  auto; currently objective-c
(gdb) 

Трассировка стека после типизации:

GNU gdb 6.3.50-20050815 (версия Apple gdb-1518) (суббота, 12 февраля 02:52:12 UTC 2011) Copyright 2004 Free Software Foundation, Inc. GDB - это свободное программное обеспечение, охватываемое GNUСтандартная общественная лицензия, и вы можете изменять ее и / или распространять ее копии при определенных условиях.Введите «показать копирование», чтобы увидеть условия.На GDB нет абсолютно никаких гарантий.Тип "показать гарантию" для деталей.Эта GDB была настроена как «x86_64-apple-darwin» .sharedlibrary apply-load-rules all Присоединение к процессу 99324. 2011-10-08 14: 27: 52.593 Do You Like Me [99324: 207] - [RegistrationViewController tableView: numberOfRowsInSection:]: нераспознанный селектор отправлен в экземпляр 0x6833500 2011-10-08 14: 27: 52.596 Do You Like Me [99324: 207] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [RegistrationViewController tableView:numberOfRowsInSection:]: нераспознанный селектор, отправленный экземпляру 0x6833500 '* Стек вызовов при первом броске: (0 CoreFoundation 0x00dc35a9 exceptionPreprocess + 185 1 libobjc.A.dylib
0x00f17313 objc_exception_Fbb 0 0 0 0 0 0)- [NSObject (NSObject) doesNotRecognizeSelector:] + 187 3
CoreFoundation 0x00d34966 __ переадресация
+ 966 4 CoreFoundation 0x00d34522 _CF_forwarding_prep_0 + 50 5 UIKit 0RedeGateBowDate_RowDate_Row_D_WD_WD_WD_WD_WD_WD_WD_WD_WD_WD_WD_WD_WD_WR_DOWN_DOWN_RED_WRED_RID_NOW_DOWD_WARE_SW.RID1834 6 UIKit
0x001cfd88 - [UITableViewRowData numberOfRows] + 108 7 UIKit
0x00083677 - [UITableView noteNumberOfRowsChanged] + 132 8 UIKit
0x00090708 - [UITableView reloadData] + 873 0 * UITSIT * 873 0 UXITS - 873 930 UIK - UIT UIT UITSITSBOWN + 873 930 UIS10 QuartzCore * тысяча сорок-один * 0x016ada5a - [CALayer layoutSublayers] + 181 11 QuartzCore * тысяча сорок-два * 0x016afddc CALayerLayoutIfNeeded + 220 12 QuartzCore
0x016550b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 13 QuartzCore 0x01656294 _ZN2CA11Transaction6commitEv + 292 14 QuartzCore 0x0165646d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 15 CoreFoundation 0x00da489b * 1 044 * CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 27 16 CoreFoundation 0x00d396e7 __CFRunLoopDoObservers + 295 17 CoreFoundation 0x00d021d7 __CFRunLoopRun + 1575 18 CoreFoundation 0x00d01840 CFRunLoopRunSpecific + 208 19 CoreFoundation + 0undex 0 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 пользователь 0RunS0RunSunSigner7 21 GraphicsServices
0x00ffb289 GSEventRun + 115 22 UIKit
0x00023c93 UIApplicationMain + 1160 23 Do You Like Me
0x00001fde main + 126 24 Завершение вызова You Like Me
0x00001f55 start + 53) прекращается после вызова экземпляра'NSException' Текущий язык: авто;в настоящее время target-c (gdb)

Как мне пройти через это?

1 Ответ

3 голосов
/ 09 октября 2011

Три вещи. Во-первых, используйте свойство navigationController вместо parentViewController. Так что вместо этого:

UINavigationController *navController = (UINavigationController *)self.parentViewController;  
[navController pushViewController:registration animated:YES];

сделать это:

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

Во-вторых, не отправляйте сообщение release на контроллер навигации:

[navController release]; // Don't do this!

В-третьих, сообщение об ошибке в консоли дает четкую подсказку о природе проблемы:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[RegistrationViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x6833500

Это означает, что программа потерпела крах при попытке отправить сообщение tableView:numberOfRowsInSection: экземпляру RegistrationViewController, поэтому убедитесь, что в классе есть реализация отсутствующего метода. (Примечание: если вы думаете, что он уже реализует этот метод, проверьте еще раз, чтобы он был написан правильно.)

...