使用NSString * const为每个视图子类加载不同的媒体文件

如何解决使用NSString * const为每个视图子类加载不同的媒体文件

|| 我正在用代码(没有IB)完全制作UIView的子类,我们将其称为ContentView。在此视图中,我已经为声音和视频设置了多个播放器,以及几个imageView(没什么特别的)。 接下来,我计划多次对ContentView进行子类化,以便为每个视图加载不同的媒体。所有这些视图都将具有相同的视图控制器,因为所有接口的界面都相同,只有内容(声音,视频和图像)会发生变化。 因此,我要解决此问题的方法是在ContentView.h中声明几个ѭ0,并以ѭ1的形式在ContentView的每个子类视图的实现文件中指定其键/值,因为我将重用它们为每个加载不同的媒体查看并且不希望它们出现在全局名称空间中。 这是一些样机代码,说明了我在说什么: 在ContentView.h中
@interface ContentView : UIView {

NSString *const kSoundFile1;
NSString *const kSoundFile2;
NSString *const kSoundFileType;
NSString *const kMovieFile1;
NSString *const kMovieFile2;
NSString *const kMovieFileType;
NSString *const kImage1;
NSString *const kImage2;
在ContentView.m中,
@implementation ContentView 

- (id)initWithFrame:(CGRect)frame
{ 
   self = [super initWithFrame:frame];
       if (self) {

       NSString *filePath1 = [[NSBundle mainBundle] pathForResource: kSoundFile1 
                                                         ofType: kSoundFileType;

       NSURL *url1 = [[NSURL alloc] initFileURLWithPath:filePath1];

       AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:nil];
       [audioPlayer1 prepareToPlay];
       [url1 release];
...等等,对于其余的声音文件和电影(图像除外,我使用的是
imageNamed:
)。 然后,在ContentView的每个子类的实现文件中,我就这样:
@implementation ContentViewSubclass

static NSString *const kSoundFile1 = @\"sound1\";
static NSString *const kSoundFile2 = @\"sound2\";
static NSString *const kSoundFileType = @\"wav\";
static NSString *const kMovieFile1 = @\"movie1\";
static NSString *const kMovieFile2 = @\"movie2\";
static NSString *const kMovieFileType = @\"mov\";
static NSString *const kImage1 = @\"image1.png\";
static NSString *const kImage2 = @\"image2.png\";

@end
我无法完成这项工作。没有编译器错误或警告,只是没有任何播放或显示。我是在做错什么,还是这不是解决问题的正确方法? 我真的很感谢一些见解。提前致谢。     

解决方法

        尽管来自@deanWombourne的以下答案非常合理,但我对他的解决方案有疑问。但是我发现了问题所在(至少这是我的看法,并且现在可以正常工作)。 UIView子类已经有自己指定的初始化器,即
-(id)initWithFrame
,因此在ContentView的任何后续子类上调用
-(id)init
都不会更新任何实例变量,因为
[super init]
无处指向(或者更好,首先,超类运行first9ѭ,然后才运行
init
,等于什么也没做。 所以我的解决方案如下: (将ContentView.h的ivars更改为
NSString *pointer
的形式,例如
NSString *kSoundFile1
之后),
@implementation ContentViewSubclass

- (id)initWithFrame:(CGRect)frame {

        kSoundFile1 = @\"sound1\";
        kSoundFile2 = @\"sound2\";
        kSoundFileType = @\"wav\";
        kMovieFile1 = @\"movie1\";
        kMovieFile2 = @\"movie2\";
        kMovieFileType = @\"mov\";
        kImage1 = @\"image1.png\";
        kImage2 = @\"image2.png\";

    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

@end
首先更新指定的初始化程序
-(id)initWithFrame
上的字符串,然后才调用super。 现在工作正常。 衷心感谢@deanWombourne为解决此问题所提供的帮助。     ,        我想我可能已经解决了,请忽略其他答案:) 您已将字符串设置为ContentView的成员(在ContentView.h中)。他们开始时是15英镑。 然后,在每个子类中,使用相同的名称(但仅在该.m文件中)创建新的字符串(使用static关键字即可!)。只是因为它们在C代码中具有相同的名称并不意味着它们指向相同的对象:) 您的ContentView.m文件看不到新字符串,它仅使用.h文件中定义的字符串,这些字符串从未设置为任何值,因此我敢打赌它们仍然是15美元! 您需要像这样在子类中定义字符串:
@implementation ContentViewSubclass

- (id)init {
    self = [super init];
    if (self) {
        kSoundFile1 = @\"sound1\";
        kSoundFile2 = @\"sound2\";
        kSoundFileType = @\"wav\";
        kMovieFile1 = @\"movie1\";
        kMovieFile2 = @\"movie2\";
        kMovieFileType = @\"mov\";
        kImage1 = @\"image1.png\";
        kImage2 = @\"image2.png\";
    }
    return self;
}

@end
PS这些名字前面的
k
不再有意义-我会摆脱它)     ,        编辑:这个答案是完全吠叫了错误的树。试试这个吧:) 我立即寻找这条线:
AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:nil];
SDK希望告诉您错误,但您不希望这样做。然后,您抱怨没有错误! 尝试这个:
NSError *error = nil;
AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:&error];
if (error) {
    NSLog(@\"error : %@\",error);
}
让我们知道您所看到的。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-