Проблема с использованием UITableView - PullRequest
0 голосов
/ 08 января 2011

Я сейчас бьюсь головой о кирпичную стену, пытаясь вернуть свое приложение к работе.

Все, что я хочу сделать, это показать UIActionSheet, как только будет выбрана строка в моем поисковом табличном представлении.Простая задача, которая может показаться ... кажется, нет.

Когда я запускаю приложение на симуляторе, оно SIGABRT еще до того, как оно даже загрузило rootViewController (StackTrace ниже).Я абсолютно не знаю, с чего начать копать.

Метод делегата моего приложения "didFinishLaunchingWithOptions" проходит гладко, последняя точка останова, которую я могу установить в своем коде, это:

OverviewViewController.m:

- (void)viewWillAppear:(BOOL)animated
{
    // this it the last breakable line, jumping over it leads to the SIGABRT
    [super viewWillAppear:animated];
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewItem:)];
    [[self navigationItem] setRightBarButtonItem:addButton];
    [addButton release];
}

OverviewViewController - это мой NavigationController rootViewController, оба инициализированы в методе делегата приложения didFinishLaunchingWithOptions.

AppDelegate.m

OverviewViewController *ovController = [[OverviewViewController alloc] init];

(omitting initialization code for ovController)

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:ovController];
[ovController release];

NSArray *tabViews = [NSArray arrayWithObjects:navController, (my other controllers), nil];
[navController release];

[tabController setViewControllers:tabViews];
[window setRootViewController:tabController];

Ошибка начала появляться после iначал реализовывать совершенно другое представление (SearchControllerView), используя стандартные методы UITableViewDelegate и UITableViewDateSourceDelegate.Это представление даже не загружается при запуске, только при нажатии определенной кнопки.

StackTrace:

2011-01-08 13:22:21.279 ReleaseDate[5295:207] -[UITableView _saveOpaqueViewState:]: unrecognized selector sent to instance 0x502e000
2011-01-08 13:22:21.282 ReleaseDate[5295:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableView _saveOpaqueViewState:]: unrecognized selector sent to instance 0x502e000'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x0118bbe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x012e05c2 objc_exception_throw + 47
    2   CoreFoundation                      0x0118d6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x010fd366 ___forwarding___ + 966
    4   CoreFoundation                      0x010fcf22 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x006745b3 -[UITableViewRowData initWithTableView:] + 285
    6   UIKit                               0x0052eae3 -[UITableView(_UITableViewPrivate) _updateRowData] + 84
    7   UIKit                               0x0052a6da -[UITableView numberOfSections] + 39
    8   UIKit                               0x006c25ee -[UITableViewController viewWillAppear:] + 100
    9   ReleaseDate                         0x00003364 -[OverviewViewController viewWillAppear:] + 68
    10  UIKit                               0x00579c9a -[UINavigationController _startTransition:fromViewController:toViewController:] + 858
    11  UIKit                               0x00574606 -[UINavigationController _startDeferredTransitionIfNeeded] + 266
    12  UIKit                               0x0068ce01 -[UILayoutContainerView layoutSubviews] + 226
    13  QuartzCore                          0x01f25451 -[CALayer layoutSublayers] + 181
    14  QuartzCore                          0x01f2517c CALayerLayoutIfNeeded + 220
    15  QuartzCore                          0x01f1e37c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
    16  QuartzCore                          0x01f1e0d0 _ZN2CA11Transaction6commitEv + 292
    17  UIKit                               0x004c019f -[UIApplication _reportAppLaunchFinished] + 39
    18  UIKit                               0x004c0659 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690
    19  UIKit                               0x004cadb2 -[UIApplication handleEvent:withNewEvent:] + 1533
    20  UIKit                               0x004c3202 -[UIApplication sendEvent:] + 71
    21  UIKit                               0x004c8732 _UIApplicationHandleEvent + 7576
    22  GraphicsServices                    0x0199da36 PurpleEventCallback + 1550
    23  CoreFoundation                      0x0116d064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    24  CoreFoundation                      0x010cd6f7 __CFRunLoopDoSource1 + 215
    25  CoreFoundation                      0x010ca983 __CFRunLoopRun + 979
    26  CoreFoundation                      0x010ca240 CFRunLoopRunSpecific + 208
    27  CoreFoundation                      0x010ca161 CFRunLoopRunInMode + 97
    28  UIKit                               0x004bffa8 -[UIApplication _run] + 636
    29  UIKit                               0x004cc42e UIApplicationMain + 1160
    30  ReleaseDate                         0x00002ac4 main + 102
    31  ReleaseDate                         0x00002a55 start + 53
)
terminate called after throwing an instance of 'NSException'

Кто-нибудь может помочь мне встать на правильный путь?Я действительно начинаю сходить с ума от этого ...

ОБНОВЛЕНИЕ

Реализация cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"] autorelease];
    }

    // set search item information
    WebSearchItem *wsi = [self.searchData objectAtIndex:[indexPath row]];
    [[cell textLabel] setText:[wsi title]];
    [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%@ - %@", [wsi descText], [[wsi releaseDate] dateToString:@"yyyy-MM-dd"]]];
    [cell setAccessoryType:UITableViewCellAccessoryDetailDisclosureButton];

    return cell;
}

Реализация OverviewViewController.m init методы

- (id)init
{
    [super initWithStyle:UITableViewStyleGrouped];  
    [[self navigationItem] setTitle:@"ReleaseDate"];    
    return self;
}

-(id)initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

ОБНОВЛЕНИЕ 2

OverviewViewController.h

@interface OverviewViewController : UITableViewController {
    ...
}

SearchViewController.h

@interface SearchViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UIActionSheetDelegate> {
    IBOutlet UITableView *tableView;
    ...
}

@property (nonatomic, retain) IBOutlet UITableView *tableView;

1 Ответ

0 голосов
/ 08 января 2011

Ответ лежит в исключении:

2011-01-08 13:22:21.279 ReleaseDate[5295:207] -[UITableView _saveOpaqueViewState:]:
                        unrecognized selector sent to instance 0x502e000
2011-01-08 13:22:21.282 ReleaseDate[5295:207] *** Terminating app due to uncaught
                        exception 'NSInvalidArgumentException', reason: '-[UITableView
                        _saveOpaqueViewState:]: unrecognized selector sent to
                        instance 0x502e000'

Это говорит о том, что некоторому объекту (а именно: UITableView объекту, выделенному по адресу памяти 0x502e000) было отправлено сообщение («селектор», то есть метод был вызван для него), которое он не понимает. Сообщение _saveOpaqueViewState:. Погуглив, вы обнаружите, что этот селектор обычно вызывается на UITableViewCell экземплярах.

Это, вероятно, означало бы, что вы возвращаете UITableView куда-нибудь, где вместо этого вы должны вернуть UITableViewCell.

Пожалуйста, посмотрите (или поделитесь) код, который у вас есть для

-(UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)ip
{
}

И посмотрите, не выдаст ли там компилятор несколько предупреждений.

обновление Хорошо, увидев ваш код, мы можем сделать вывод, что эта теория не применима. Другой вариант заключается в том, что вы преждевременно освобождаете объект, так что сообщение, отправленное на некоторый UITableViewCell (который исчез), заканчивается на другом объекте, случайно UITableView. Вы можете попробовать установить NSZombiesEnabled или, в качестве первого быстрого исправления, вставить строку в cellForRowAtIndexPath:, как

NSLog(@"returning table view cell at addr %p for indexpath %@",cell,indexPath);

Затем вы можете сравнить адрес, зарегистрированный там, с адресом из трассировки стека, просто как начало.

update2 тогда еще одна теория: есть ли у двух UITableViewController объектов свои собственные UITableView объекты? Я полагаю, что наличие двух контроллеров, пытающихся работать с одним табличным представлением, может привести к некоторым несоответствиям.

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