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方法的正确方法是什么?
答案 0 :(得分:4)
更新:你应该是UITableViewCell而不是UITableView的子类。然后在表视图控制器的cellForRowAtIndexPath:
方法中,返回此子类的实例而不是UITableViewCell的实例。
您还需要将DetailedViewController指针传递给单元格,以便您可以在moveToNextItem
等方法中调用其touchesBegan
方法。
根据您的需要调整此示例:
@class DetailedViewController;
@interface MyTableViewCell : UITableViewCell {
DetailedViewController *dvc;
}
@property (nonatomic, retain) DetailedViewController *dvc;
@end
#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
@interface DetailedViewController : UITableViewController {
// iVars here
}
// Methods and properties here
- (void)moveToNextItem;
@end
#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]吗?