【问题标题】:how to do the same button for three screens?如何为三个屏幕做相同的按钮?
【发布时间】:2013-05-13 19:54:54
【问题描述】:

我遇到了一些麻烦。所以我有播放/停止的 AvPlayer 和 UIButton。 另外:我有三个 UiViewControllers。我需要当我点击第二个控制器上的第一个 UIVIewController 上的第一个按钮时,也分别按下第三个控制器按钮,相反,也是。它是如何制作的?有什么建议吗?

这是简单的代码 - 按下按钮 - 播放 URL 流,当再次按下时停止音乐。

-(IBAction)playRadioButton:(id)sender
{
    if(clicked == 0) {    
        clicked = 1;
        NSLog(@"Play");
        NSString *urlAddress = @"http://URLRADIOSTREAM";
        NSURL *urlStream = [NSURL URLWithString:urlAddress];
        myplayer = [[AVPlayer alloc] initWithURL:urlStream];
        [myplayer play];
        [playRadioButton setTitle:@"Pause" forState:UIControlStateNormal];
    }
    else
    {
        NSLog(@"Stop");
        [myplayer release];
        clicked = 0;
        [playRadioButton setTitle:@"Play" forState:UIControlStateNormal];
    }
}

【问题讨论】:

  • 您的代码看起来不错。有什么问题?到目前为止,我只看到一个按钮,没有视图控制器。如果用户在一个视图控制器中点击“播放”并且它更改为“停止”然后移动到另一个视图控制器,那么按钮是否也应该说“停止”?
  • 另外,“我有三个视图控制器”是什么意思?它们是同时存在(UITabBarController)还是在不同时间存在(UINavigationController、呈现的视图控制器等)?这有很大的不同,因为您无法向尚不存在的视图控制器发送消息。
  • 有什么要了解的?我有三个屏幕。在第一个屏幕上,我将按钮放在第二个和第三个屏幕上。当我按下第一个屏幕上的按钮时,第二个和第三个也应该按下。
  • 我没有放控制器的代码,问题中根本不需要它。

标签: ios xcode uiviewcontroller uibutton


【解决方案1】:

如果您有多个控制器需要通知另一个控制器上的事件,您可以使用NSNotificationCenter

例如。在 ViewDidLoad 的一个控制器中

[[NSNotificationCenter defaultCenter]    addObserver:self 
                                            selector:@selector(playBtnClicked:)
                                                name:@"BTN_CLICKED"
                                              object:nil]; 

同样在同一个控制器中定义选择器,例如

-(void)playBtnClicked:(NSNotification *)pNotification
{
// do something
}

在另一个控制器中使用触发它

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

【讨论】:

  • 成功了!当我按下按钮时,屏幕也发生了变化并播放了音乐但是我无法从另一个控制器的播放按钮中停止音乐...我在 VievDidLoad 的另一个 ViewController 中插入这个:[[NSNotificationCenter defaultCenter] postNotificationName:@“BTN_CLICKED”对象:无];
  • 我猜你必须发布另一个新问题,因为我有点迷失了方向,而且我对AVPLAYER 类也不是很熟悉。
【解决方案2】:

如果您不想使用 nsnotifications,请使用协议并通过委托通知其他视图控制器

【讨论】:

    【解决方案3】:

    首先,这 3 个视图控制器是同时分配和初始化的吗?如果没有,我建议您在 AppDelegate 类上设置一个属性,如下所示:

    @interface AppDelegate
    
    @property (nonatomic, assign) BOOL commonButtonPressed;
    // All your code here
    
    @end
    

    你可以像这样设置这个属性:

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.commonButtonPressed = YES; // or NO;
    

    然后,从您的 UIViewController 课程中:

    - (void)viewWillAppear:(BOOL)animated {
    
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        if (appDelegate.commonButtonPressed) {
    
            // Logic of what happens to the button goes here.
        }
    }
    

    另一种不接触AppDelegate 类的方法是使用NSUserDefaults,如下所示:

    [[NSUserDefaults standardDefaults] setBool:(<YES or NO>) forKey:@"commonButtonPressed"];
    [[NSUserDefaults standardDefaults] synchronize];
    

    你可以像这样读回这个值:

    BOOL buttonPressed = [[NSUserDefaults standardDefaults] boolForKey:@"commonButtonPressed"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2017-03-27
      相关资源
      最近更新 更多