将函数从一个类调用到另一个类

时间:2016-06-02 10:33:09

标签: ios objective-c uiviewcontroller

我有两个视图控制器:一个ViewController,另一个TextViewController。我在ViewController中给出了函数的定义,并希望在TextViewController中调用它,但我无法做到这一点。请帮我解决这个问题。

.h类中的函数声明

@interface ViewController : UIViewController

-(void)getVideo;

.m类中函数的定义

-(void)getVideo{
NSString *inputPath = [[NSBundle mainBundle]pathForResource:@"GalaxyTutorial" ofType:@"mp4"];
NSURL *inputURL = [[NSURL alloc]initFileURLWithPath:inputPath isDirectory:YES];
MPMoviePlayerViewController* moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL: inputURL];
[mpc.view setFrame: self.view.bounds];
[self.view addSubview:moviePlayer.view];
}

我在TextViewController.m中调用它就像这样

ViewController *dtl = [[ViewController alloc]init];
[dtl getVideo];

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

使用NSNotificationCenter PostNotificationName方法,示例如下,

首先在viewDidLoad中创建添加观察者通知:,

ViewController.m类:

- (void)viewDidLoad {
    [super viewDidLoad];
    // put your code

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callService:) name:@"NotificationName" object:nil];

}

- (void)callService:(NSNotification *)noti {
    [self getVideo];
}

然后在被调用函数中设置postNotification名称,格式为

First Class(调用类):

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationName" object:nil];

不要忘记您的通知名称是同名,请在PostNotificationName和addObserver名称中输入。

希望它有用

答案 1 :(得分:0)

我建议您使用委托模式而不是通知..

我相信通过使用名称很好的协议和名称很好的协议方法定义,控制器之间的通信应该非常明确。努力定义这些协议方法将产生更容易阅读的代码,并在您的应用程序中提供更多的可跟踪性。编译器将获取对委托协议和实现的更改,如果不是(EG,如果您使用选择器),您的应用程序将至少在开发过程中崩溃,而不仅仅是让事情无法正常工作。即使在多个控制器需要被告知同一事件的情况下,只要您的应用程序在控制器层次结构中结构良好,消息就可以在层次结构中向上传递,在那里它们可以传递回所有需要知道的控制器。事件。

当然,有一些例外,其中委托模式不适合,通知更有意义。示例可能是应用程序中的每个控制器都需要知道的事件。然而,这些类型的场景非常罕见。另一个示例可能是您正在构建一个框架,需要向正在运行的应用程序发布事件。

根据经验,我只会使用观察,对于我没有编码的对象中的属性级事件,或者对于紧密绑定到视图对象的模型对象中的属性级事件。对于所有其他事件,我将总是尝试使用委托模式,如果由于某种原因我不能这样做,我将首先评估我的应用程序结构是否有严重错误,如果没有,我将使用通知。

答案 2 :(得分:0)

这样做:

<强> ViewController.m

-(NSURL *)getVideoURL
{
    NSString *inputPath = [[NSBundle mainBundle]pathForResource:@"GalaxyTutorial" ofType:@"mp4"];
    NSURL *inputURL = [[NSURL alloc]initFileURLWithPath:inputPath isDirectory:YES];
    return inputURL;
}

<强> TextViewController.m

-(void)playVideo
{
    ViewController *dtl = [[ViewController alloc]init];
    NSURL *url = [dtl getVideo];

    MPMoviePlayerViewController* moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL: inputURL];
    [mpc.view setFrame: self.view.bounds];
    [self.view addSubview:moviePlayer.view];
}