1

我的应用程序中有 2 个 ViewController。

ViewController1 播放音频,ViewController2 显示一些文本。

当我在 ViewController2 中时,我想使用遥控器来控制音频。例如,用户在 ViewController2 中并想要停止音频。

我的代码:

ViewController1.m 完美运行

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent
{
    MARK;
    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlTogglePlayPause:
                DLog(@"remotecontrol_toggle");
                [self togglePlayPause];
                break;

            case UIEventSubtypeRemoteControlPause:
                DLog(@"remotecontrol_pause");
                [self pause];
                break;

            case UIEventSubtypeRemoteControlPlay:
                DLog(@"remotecontrol_play");
                [self play];
                break;

            case UIEventSubtypeRemoteControlStop:
                DLog(@"remotecontrol_stop");
                [self stop];
                break;

            default:
                break;
        }
    }
}

我的问题是,把这一切放在一起的最好方法是什么?我必须处理 ViewController2 中的事件吗?

我知道在 AppDelegate.m 中,我可以这样做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MARK;
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    MARK;
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
}

这样,我的应用程序在每个视图中控制遥控器,但这并不能解决我的问题,因为在 ViewController2 中没有处理接收到的事件。

但是我不能处理 AppDelegate.m 中收到的事件,所以我必须处理每个 ViewController 中的事件?

我是iOS开发的新手,不知道我是否在这里思考。

任何帮助表示赞赏。

4

3 回答 3

2

最简单的方法是在创建 ViewController1 时将对 ViewController2 的引用传递给它。最简单的方法是有一个带有引用的 init 方法......

- (id) initWithController:(UIViewController*)controller
{
   self = [super init];
    if (self) {
        _controller1 = controller;
    }
    return self;
}

然后使用相同的方法接收事件,但调用 ViewController1 来处理它们......

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent
{

    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlTogglePlayPause:
                DLog(@"remotecontrol_toggle");
                [self.controller1 togglePlayPause];
                break;

            // etc.
        }
    }
}
于 2013-11-14T21:30:51.993 回答
1

最简单的方法是继承 UIApplication 并在那里处理事件。

于 2014-01-09T11:22:52.410 回答
0

有 3 种解决方案 2 失败 1 正确。

我现在懒得解释为什么其他 2 失败了。所以这是我的实现逻辑(我也用音频做了)

有一个模型,有几个控制器,有几个视图。首先熟悉ModelViewController模式,因为这里需要做一个多控制器和多视图:)

在一个类中,不需要 UIViewController 存储数据,即“模型”。在这里,您可以看到歌曲名称、音量、猫颜色、狗鞋尺寸等等。

现在实现几个控制器。这些类为同一模型实例(您的示例文本)设置了一些属性值。

在其他类中,您甚至可以实现接收器:该模型具有 setter 函数并为已订阅的事件侦听器填充触发事件。- 好吧,这解释为 Java,但在 iOS 中是一样的。

这些属性更改事件侦听器可以嵌入到新控制器或新视图中。

说起来容易,对于初学者来说很难正确实施。

我给出了一个想法和关键字来搜索什么。希望它会帮助你。

有 2 个更简单的解决方案,但无法正常工作。

于 2013-10-25T17:25:55.203 回答