【问题标题】:How to call a method of another Class?如何调用另一个类的方法?
【发布时间】:2011-03-15 05:24:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: iphone objective-c methods instance


    【解决方案1】:

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

    【讨论】:

    • sry,但这不起作用。我什至在我问之前就试过了。
    【解决方案2】:

    更新:您可能应该继承 UITableViewCell 而不是 UITableView。然后在表格视图控制器的cellForRowAtIndexPath: 方法中,返回这个子类的实例而不是 UITableViewCell 的实例。

    您还需要将DetailedViewController 指针传递给单元格,以便您可以在touchesBegan 等方法中调用其moveToNextItem 方法。

    根据您的需要调整此示例:

    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 精确 :),解释一下 WHY 不是很好吗?
    • sry,这行不通,我也认为这行得通。
    • 这确实有效,而且它是你如何做你所说你正在尝试做的事情。发布您的代码,因为您在某处遇到奇怪的错误,或者您正在尝试与您描述的内容不同的东西。
    • 好吧,我试着写所有的连接... 在 IB 中,我有一个 UITableViewController 命名为DetailedViewController,NIB 文件是SpecificTable,一个新的类包含“.h, .m , .xib" 在这个类中,我覆盖了 TouchesBegan、TouchesMoved 等方法,包括在 TouchesMoved 方法中的这个: if (mystartTouchPosition.x
    • 哦,对不起,我总是忘记写错误,对不起。首先,有一个名为“'SpecificTable' 可能无法响应'-moveToNextItem'”的警告,如果我调用该方法(通过触摸)应用程序崩溃..
    【解决方案3】:

    您正在寻找 [NSNotificationCenterdefaultCenter] 吗?

    【讨论】:

    • 我不太确定这与问题有何关系。需要详细说明吗?
    • 为了在两个不同的视图控制器之间进行通信,有时没有方便的方法来访问另一个视图控制器的实例/方法。一种通信方式是广播通知,其他感兴趣的视图控制器可以订阅/收听此类通知。我不明白为什么我的回答被否决了。否决者请解释一下。
    【解决方案4】:

    如果SpecificTable真的是DetailedViewController的子类,你可以调用

    [self moveToNextItem];
    

    如前所述。

    但我认为您的意思是子视图吗?所以SpecificTable.view是一个子视图ob DetailedViewController.view

    那么你有几个选择。例如使用NSNotificationCenter

    或者对你来说可能也是一个好方法是在你的SpecificTable 中设置一个DetailedViewController 的实例变量,并在你初始化你的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。

    【讨论】:

    • 非常感谢,但我很确定我的意思是子类。所以我有一个名为DetailedViewController 的UITableViewController,我在那里声明了tableView。在 IB 中,NIB 是子类,SpecificTable (type:UITableView),并且在那里声明了 tableView。 (我用它在 TableViewCell 中启用 TouchesBegan 等)。
    • 因此您必须向我们提供更多代码和/或您的东西在 IB 中的连接方式。通常[self moveToNextItem]; 应该可以工作。
    • 我把连接贴在了IB的robinjam的回答下,希望能帮到你,否则请教,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多