Я пытаюсь сделать следующее

 ReaderController *readerController =  [[[ReaderController alloc] init] autorelease];;
readerController.fileName = fileName;
[readerController handleSingleTap];

Где handleSingleTap - это метод в ReaderController, но я не могу его назвать .. метод следующий

 - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
#ifdef DEBUGX
    NSLog(@"%s", __FUNCTION__);
#endif

    ReaderDocument *document = [ReaderDocument unarchiveFromFileName:SAMPLE_DOCUMENT];

    if (document == nil) // Create a brand new ReaderDocument object the first time we run
    {
        NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectoryPath = [searchPaths objectAtIndex:0]; 
        NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:[[NSString stringWithFormat:@"%@",fileName] stringByAppendingPathExtension:@"pdf"]];



        [self checkAndCreatePList];
        NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:pListPath];

        [plistDict setValue: [NSString stringWithFormat:@"%@",fileName]  forKey:@"fileName"];
        [plistDict writeToFile:pListPath atomically: YES];



//      NSString *filePath = [[NSBundle mainBundle] pathForResource:path ofType:nil];

        document = [[[ReaderDocument alloc] initWithFilePath:path password:nil] autorelease];
    }

    if (document != nil) // Must have a valid ReaderDocument object in order to proceed
    {
        ReaderViewController *readerViewController = [[ReaderViewController alloc] initWithReaderDocument:document];

        readerViewController.delegate = self; // Set the ReaderViewController delegate to self

#if (DEMO_VIEW_CONTROLLER_PUSH == TRUE)

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

#else // present in a modal view controller

        readerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        readerViewController.modalPresentationStyle = UIModalPresentationFullScreen;

        [self presentModalViewController:readerViewController animated:YES];

#endif // DEMO_VIEW_CONTROLLER_PUSH

        [readerViewController release]; // Release the ReaderViewController
    }
}

Что не так и почему я не могу вызвать этот метод, пожалуйста, мне нужны некоторые подробности, любая помощь приветствуется

0
Mohamed Emad Hegab 29 Авг 2011 в 16:24

2 ответа

Лучший ответ

Что вы упустили, так это то, как работают методы и селекторы. Двоеточие в определении метода является частью имени селектора. Например, эти три метода:

-(void)updateInterface;
-(void)handleSingleTap:(id)sender;
-(void)updateItemAtIndex:(NSInteger)integer animated:(BOOL)animated;

Имеет эти полные имена селекторов:

updateUserInterface
handleSingleTap:
updateItemAtIndex:animated:

Имена всегда должны совпадать полностью. Включая двоеточия, которые, я должен еще раз подчеркнуть, являются частью имен.

Вы звоните по этому поводу:

[readerController handleSingleTap];

Не включает двоеточие в имя, поэтому код предполагает, что метод с этим определением существует, и пытается его вызвать:

-(id)handleSingleTap;

Поскольку его не существует, вы получаете исключение, и ваше приложение вылетает.

Если вы не хотите отправлять аргумент, вы все равно должны иметь полное имя. Но можно передать аргумент, который можно игнорировать, например nil, например:

[readerController handleSingleTap:nil];
1
PeyloW 29 Авг 2011 в 12:48

Ну это довольно просто, вы сделали:

[readerController handleSingleTap];

Когда на самом деле вам следует сделать:

[readerController handleSingleTap:yourRecognizer];

Или

[readerController handleSingleTap:nil];

Если вы не передадите аргумент распознавателя, вы отправите сигнал handleSingleTap, когда ожидается handleSingleTap:

2
apouche 29 Авг 2011 в 12:31