Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从containerview(iOS-objective-c)处理父UI_Ios_Iphone_Objective C_Delegates - Fatal编程技术网

从containerview(iOS-objective-c)处理父UI

从containerview(iOS-objective-c)处理父UI,ios,iphone,objective-c,delegates,Ios,Iphone,Objective C,Delegates,我在主viewcontroller中有一个方法: - (void)playMusic:(NSString*)songTitle :(NSString*)songArtist :(NSString*)songDuration :(NSString*)songUrl{ [songPlayer pause]; songPlayer = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:songUrl]]; [songPla

我在主viewcontroller中有一个方法:

- (void)playMusic:(NSString*)songTitle :(NSString*)songArtist :(NSString*)songDuration :(NSString*)songUrl{

    [songPlayer pause];

    songPlayer = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:songUrl]];

    [songPlayer play];

    self.songSlider.maximumValue = 100;

    self.songSlider.value = 0;

}
我从containerview中的视图中调用它,如下所示(通过单击按钮)

歌曲播放器(这是一个AVPlayer)做得很好,歌曲开始没有问题。 但是songSlider(它是一个UISlider)没有更新

如果我把考试叫做同样的说明:

self.songSlider.maximumValue = 100;

self.songSlider.value = 0;
在我的主cotroller的viewDidLoad方法中,songSlider的更新没有问题

这让我觉得问题在于我从containerview调用函数?在这种情况下,我如何解决这个问题?谢谢

我大约一小时前回答了一个类似的问题

我怀疑问题在于主线程上没有调用您的按钮单击操作。我没有找到任何资源来说明UIControl是否总是在主线程上触发事件,因此有可能您的代码正在后台线程上运行。这一点很重要,因为您不能在主线程之外的任何其他线程上进行UI修改

在按钮回调中尝试以下操作

dispatch_sync(dispatch_get_main_queue(), ^{
     [mainController playMusic:songTitle:songArtist :songDuration :songUrl];
});

尝试使用
[self.songsloider setValue:animated:
@ChrisLoonam animated代表什么?我有一个错误:使用未定义的标识符“动画化”如下调用:
[self.songsloider setValue:0.0动画化:是]
。如果希望滑块设置更改的动画,请将
YES
。否则,请将
NO
。另外,如果您使用的是Interface Builder,请确保
songSlider
的插座已连接。@ChrisLoonam谢谢您,但它仍然不工作。我猜这是因为我正在从子containerview调用函数,但我不知道如何修复它,这正是正在发生的事情是的。我试过你的代码,它冻结了模拟器。它应该做什么?谢谢你的时间,老实说,我不知道为什么模拟器会冻结。您可以尝试在主线程上的dispatch_sync调用中仅包装songSlider更改。您可能需要签出的另一件事是
-(void)performselectornmainthread:(SEL)带对象的选择器:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray*)array
您需要使用NSInvocation,因为该方法的参数太多了,即使我调用dispatch\u sync时没有任何包装,它也会冻结模拟器。顺便说一句,mthod不是从另一个线程调用的,而是从容器中的另一个控制器调用的。这个方法被称为对按钮按下的响应。正如我所说,我不确定是否在主线程上调用了按钮按下,如果是,则不应该使用dispatch\u sync调用。您可以通过在按钮按下代码中设置断点并查看导航器中名为
Debug Navigator
的第6个选项卡来验证线程。嘿,我不确定witch线程正在做什么。以下是断点的屏幕:
dispatch_sync(dispatch_get_main_queue(), ^{
     [mainController playMusic:songTitle:songArtist :songDuration :songUrl];
});