我有一个从UITableViewController派生的BarTableViewController。 这是我的主视图,因此在应用程序启动时自动加载,并且该类的实例工作正常。
现在我想让原始实例推送同一个类的另一个实例,如下所示:
BarTableViewController *bar = [[[BarViewController alloc] initForFoo:theFoo] autorelease];
[self.navigationController pushViewController:bar animated:YES];
initForFoo方法如下所示:
- (id)initForFoo:(Foo *)theFoo
{
if ((self = [self initWithNibName:@"BarTableViewController" bundle:nil])) {
self.foo = theFoo;
}
return self;
}
推送工作和视图加载,并在模拟器中正常工作。
然而,在我的iPhone 4上,表格视图在第二个实例中没有响应:在屏幕上上下滑动我的手指什么也没做。如果我点击搜索栏然后点击取消,表格就会响应。
如果我只是调用init而不是initWithNibName,那么表视图甚至第一次就会正确响应,但当然我的IBOutlet东西都没有被绑定。
这似乎是一次性的事情:一旦我完成了搜索和取消,表格将响应,即使我点击后退按钮,然后再次返回到同一个视图控制器实例,它不会卡住。
我在这里做错了什么?
更新: 我在MainWindow.xib中确实有这个人作为RootViewController。我尝试过这个 out并让app delegate创建他,但仍然是相同的行为:一切 工作除了表视图不滚动。但现在最初的实例也被冻结了。
因此,每当我显式调用initWithNibName时,我都会遇到这种冻结行为。
UPDATE2: 我一直在评论viewDidLoad的不同块,如果我省略它,它似乎一直在工作:
[self.navigationController setToolbarHidden:NO animated:NO];
当然这意味着我没有工具栏。我已经尝试将其重新放入,没有任何工具栏项,但它仍然存在问题。
UPDATE3: 当GDB处于这种状态时突破它,这就是我在UITableView中找到的:
(gdb) p * [[[UIApplication sharedApplication] delegate] searchViewController] <UITableViewController> = { <UIViewController> = { <UIResponder> = { <NSObject> = { isa = 0x9fe44 }, <No data fields>}, members of UIViewController: _view = 0xa27600, _tabBarItem = 0x0, _navigationItem = 0x4d6dcc0, _toolbarItems = 0x0, _title = 0x0, _nibName = 0xb9120, _nibBundle = 0x242b40, _parentViewController = 0x4d6de90, _childViewControllers = 0x0, _childModalViewController = 0x0, _parentModalViewController = 0x0, _modalTransitionView = 0x0, _modalPreservedFirstResponder = 0x0, _defaultFirstResponder = 0x0, _dimmingView = 0x0, _dropShadowView = 0x0, _presentationSuperview = 0x0, _sheetView = 0x0, _currentAction = 0x0, _savedHeaderSuperview = 0x0, _savedFooterSuperview = 0x0, _editButtonItem = 0x0, _searchDisplayController = 0x4d7b290, _popoverController = 0x0, _modalTransitionStyle = UIModalTransitionStyleCoverVertical, _modalPresentationStyle = UIModalPresentationFullScreen, _lastKnownInterfaceOrientation = UIInterfaceOrientationPortrait, _contentSizeForViewInPopover = { width = 320, height = 1100 }, _formSheetSize = { width = 0, height = 0 }, _viewControllerFlags = { appearState = 2, isEditing = 0, isPerformingModalTransition = 0, hidesBottomBarWhenPushed = 0, autoresizesArchivedViewToFullSize = 0, viewLoadedFromControllerNib = 0, isRootViewController = 0, isSheet = 0, isSuspended = 0, wasApplicationFrameAtSuspend = 0, wantsFullScreenLayout = 0, shouldUseFullScreenLayout = 0, allowsAutorotation = 1, searchControllerRetained = 1, oldModalInPopover = 0, isModalInPopover = 0, restoreDeepestFirstResponder = 0, isInWillRotateCallback = 0, disallowMixedOrientationPresentations = 0, modalPresentationsAreCurrentContext = 0 } }, members of UITableViewController: _tableViewStyle = UITableViewStylePlain, _keyboardSupport = 0x4d87540, _tableViewControllerFlags = { clearsSelectionOnViewWillAppear = -1 } },
我在gdb中尝试了一些盲目的isFirstResponder刺,没有运气。
答案 0 :(得分:0)
我看了:
<{3>}中的如果在同一个NIB中创建视图控制器及其视图,并将视图嵌套在视图控制器下面,它将自动调整视图的框架。
这激发了我尝试编辑我的XIB并添加一个ViewController并将TableView置于其下 - 之前我必须在XIB和TableView中使用ViewController处于顶层。
这解决了我的“冻结表视图”问题,但我仍然不明白为什么:我做了一堆前后检查各种组件的帧大小,并且无法分辨出改变了什么。但它至少是固定的。