我有两个视图控制器:一个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];
任何帮助将不胜感激。
答案 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];
}