Как вызвать метод другого класса? - PullRequest
2 голосов
/ 13 июля 2010

EDIT2: Я пытаюсь обобщить мою проблему и решения:

У меня есть TableViewController с именем DetailViewController.Мое намерение состояло в том, чтобы активировать TouchesBegan для распознавания таких действий, как скольжение и т. Д., И обычно метод touchesbegan заменяется методом DidSelectRow.Во многих публикациях по stackoverflow подклассификация UITableView является единственной возможностью реализовать это.

Так что я создал SpecificTable с файлом .xib, и я использовал это как подкласс UITableViewController, добавив SpecificTable в качестве nib-файла.,Выбор строки работает нормально, а также метод TouchesBegan (я вызвал метод IN SpecificTable.m с предупреждением.) Но теперь я хочу вызвать метод в UITableViewController (DetailViewController), где moveToNextItem объявлен как

 -(void)moveToNextItem:(id)sender
{
 [self.navigationController
 pushViewController:bbarChart animated:YES];
}

Но при вызове этого метода с [self moveToNextItem] приложение вылетает при касании.(в режиме отладчика приложение вылетает в строке [self moveToNextItem]. Как правильно вызвать метод DetailViewController.m?

Ответы [ 4 ]

4 голосов
/ 13 июля 2010

Обновление : вероятно, вы должны создавать подкласс UITableViewCell, а не UITableView. Затем в методе cellForRowAtIndexPath: контроллера табличного представления верните экземпляр этого подкласса, а не экземпляр UITableViewCell.

Вам также нужно будет передать указатель DetailViewController в ячейку, чтобы можно было вызывать его метод moveToNextItem в методах touchesBegan и т. Д.

Адаптируйте этот пример к вашим потребностям:

MyTableViewCell.h

@class DetailedViewController;
@interface MyTableViewCell : UITableViewCell {
    DetailedViewController *dvc;
}
@property (nonatomic, retain) DetailedViewController *dvc;
@end

MyTableViewCell.m

#import "MyTableViewCell.h"
#import "DetailedViewController.h"
@implementation MyTableViewCell
    @synthesize dvc;
    - (void)someMethod { // This would be your touchesBegan, etc. methods
        [dvc moveToNextItem];
    }
    - (void)dealloc {
        [dvc release]; // We retained dvc so we have to release it when we're done with it
        [super dealloc];
    }
@end

DetailedViewController.h

@interface DetailedViewController : UITableViewController {
    // iVars here
}
// Methods and properties here
- (void)moveToNextItem;
@end

DetailedViewController.m

#import "DetailedViewController.h"
#import "MyTableViewCell.h"
@implementation DetailedViewController
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell"];
        if(cell == nil) {
            cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyTableViewCell"] autorelease];
            cell.dvc = self; // This gives the cell a reference to the detailed view controller
        }
        return cell;
    }
    - (void)moveToNextItem {
        // ...
    }
@end

Возможно, есть гораздо лучшие способы добиться того, чего вы хотите, но это лучшее, что я могу сделать без дополнительной информации.

1 голос
/ 13 июля 2010

Объявите метод в DetailViewController.h и @import этот файл в SpecificTable.h.

0 голосов
/ 13 июля 2010

, если SpecificTable действительно подкласс DetailedViewController, вы можете позвонить

[self moveToNextItem];

как уже упоминалось.

но я думаю, что вы имеете в виду подпредставление или нет? так что SpecificTable.view это подпредставление ob DetailedViewController.view

тогда у вас есть несколько вариантов. например, используя NSNotificationCenter .

или, что, вероятно, также является хорошим способом для вас, это установить переменную экземпляра DetailedViewController в вашем SpecificTable и назначить ее при запуске SpecificTable.

в качестве примера:

// the parent view .m
testTVC *tableview = [[testTVC alloc] initsomething];
tableview.parentVC = self;
[self.view addSubView:tableview.view];
[tableview release];

сейчас в вашем тесте TVC

// the .h
@interface testTVC : UITableViewController {
    testVC *parentVC;
}

@property(nonatomic,retain) testVC *parentVC;

@end


// the .m
[parentVC moveToNextItem];

Вы также должны синтезировать и выпустить свой parentVC.

0 голосов
/ 13 июля 2010

Является ли [ NSNotificationCenter defaultCenter] чем-то, что вы ищете?

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