如何调用另一个类的方法?

时间:2010-07-13 09:22:07

标签: iphone objective-c methods instance

EDIT2:我试着总结一下我的问题和解决方案:

我有一个名为DetailedViewController的TableViewController。我的目的是激活TouchesBegan以识别滑动等动作,通常,touchesbegan方法被替换为DidSelectRow方法。在stackoverflow上的许多帖子中,子类化UITableView是实现这一目标的唯一可能性。

所以我用.xib文件创建了一个SpecificTable,我把它作为UITableViewController的子类,通过添加SpecificTable作为nib文件。 选择行工作正常,还有TouchesBegan方法(我在带有Alert的SpecificTable.m中调用了一个方法。)但是现在我想在UITableViewController(DetailedViewController)中调用一个方法,其中moveToNextItem被声明为

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

但是通过使用[self moveToNextItem]调用此方法,应用程序会因触摸而崩溃。 (在调试器模式下,应用程序崩溃在[self moveToNextItem]行中。 调用DetailedViewController.m方法的正确方法是什么?

4 个答案:

答案 0 :(得分:4)

更新:你应该是UITableViewCell而不是UITableView的子类。然后在表视图控制器的cellForRowAtIndexPath:方法中,返回此子类的实例而不是UITableViewCell的实例。

您还需要将DetailedViewController指针传递给单元格,以便您可以在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 :(得分:1)

在DetailedViewController.h中声明方法,并在SpecificTable.h中@import该文件。

答案 2 :(得分:0)

如果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];

现在在你的testTVC

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

@property(nonatomic,retain) testVC *parentVC;

@end


// the .m
[parentVC moveToNextItem];

您还必须合成并释放您的parentVC。

答案 3 :(得分:-1)

您正在寻找[NSNotificationCenter defaultCenter]吗?