Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用NSUserDefaults进行表情符号比较误差

我创建了一个表情菜单,用户可以选择它们并在图片上使用。然而,很难让“最近选择的表情符号”部分正常工作,因为NSUserDefaults很可能。当我在8个视图中选择一个表情符号时,这个表情符号将被添加到一个NSMutableArray中,下次我打开表情符号菜单时,这个表情符号将像预期的那样第一个出现在“最近选择的表情符号”视图中。我实现了以下代码,以便当我选择一个表情符号时(无论是直接通过“最近选择的表情符号视图”还是通过其他8个视图中的任何一个-这9个视图是通过水平滚动视图连接起来的-如果这个表情符号已经出现在“最近选择的表情符号视图”中,它将从视图中删除并添加到视图的开头)。实际上,我从表情符号数组的索引中删除,删除“最近选择的表情符号”视图中的所有子视图,并根据新的表情符号数组重新填充它的子视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 - (void)emojiButtonPressed:(UIButton *)button {

     NSLog(@"ARRAY EQUALS = %@", historicEmojiQueue);
     NSLog(@"ARRAY AMOUNT EQUALS = %lu", (unsigned long)[historicEmojiQueue count]);

     if ([historicEmojiQueue count] < 30){

        NSLog(@"Not full");
        for ( int j = 0; j < [historicEmojiQueue count]; j++){
            NSLog(@"IN THE LOOP - START PRINT");
            NSLog(@"%@", button.titleLabel.text);
            NSLog(@"%@", historicEmojiQueue[j]);
            NSLog(@"IN THE LOOP - END PRINT");
            if ( button.titleLabel.text == historicEmojiQueue[j] ){
                NSLog(@"EQUAL ADDITION TO ITEM ALREADY PRESENT");
                [historicEmojiQueue removeObjectAtIndex:j];
            }

        }
        [historicEmojiQueue insertObject:button.titleLabel.text atIndex:0];
    }
    else{
        NSLog(@"Full");
        BOOL equal = NO;
        for ( int j = 0; j < [historicEmojiQueue count]; j++){
           NSLog(@"IN THE LOOP - START PRINT");
           NSLog(@"%@", button.titleLabel.text);
           NSLog(@"%@", historicEmojiQueue[j]);
           NSLog(@"IN THE LOOP - END PRINT");
           if ( button.titleLabel.text == historicEmojiQueue[j] ){
               NSLog(@"EQUAL ADDITION TO ITEM ALREADY PRESENT");
               [historicEmojiQueue removeObjectAtIndex:j];
               equal = YES;
           }
        }  
        if (equal == NO){
            [historicEmojiQueue removeLastObject];
        }
        [historicEmojiQueue insertObject:button.titleLabel.text atIndex:0];
    } 
    NSLog(@"ARRAY EQUALS aF= %@", historicEmojiQueue);
    NSLog(@"ARRAY AMOUNT EQUALS aF= %lu", (unsigned long)[historicEmojiQueue count]);


    [[NSUserDefaults standardUserDefaults] setObject:historicEmojiQueue forKey:@"historicQueue"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    (MORE CODE THAT DOES NOT AFFECT THE PROBLEM)
}

当我选择一个表情符号,让我们说比萨,然后选择另外5个不同的表情,再选择比萨,它的工作完美:比萨饼从第六个位置移除,并添加到第一个。如果我再次运行这个应用程序,我最后的更改将保存到NSUserDefaults,所以必胜客将是第一个在“最近选择的表情符号”视图上显示的表情符号。现在,如果我再次选择Pizza,则不会删除以前的Pizza和列表中的第一个,添加新的,然后在数组的第一个和第二个位置添加两个Pizza表情,然后在视图中。如果我点击视图中的任何一个旧的表情符号(就像第二个比萨饼),它就会被删除并添加到开头。在必胜客的例子中,点击老比萨(第二位置)不会产生任何明显的变化,因为他们是平等的,但我相信他们交换位置。下面是ViewDidLoad中从NSUserDefaults获取数组的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 NSMutableArray * historicEmojiQueue;
 @implementation myEmojiView

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

         NSMutableArray * permanentQueue = [[NSUserDefaults standardUserDefaults] objectForKey: @"historicQueue"];

          if ( permanentQueue == NULL) {
              historicEmojiQueue =  [[NSMutableArray alloc] init];
              [[NSUserDefaults standardUserDefaults] setObject:historicEmojiQueue forKey:@"historicQueue"];
          }
          else{
              historicEmojiQueue = [[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];
          }
     }
     (MORE CODE)
}

我提出问题的原因是第一个代码块打印出来的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ARRAY EQUALS = (
"\Ud83c\Udf55",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf52",
"\Ud83d\Ude18",
"\Ud83d\Ude43",
"\Ud83c\Udfc8",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83d\Ude44",
"\Ud83d\Ude0e",
"\Ud83e\Udd14",
"\Ud83d\Ude12",
"\Ud83d\Ude07",
"\Ud83d\Ude1c",
"\Ud83e\Udd11",
"\Ud83d\Ude17",
"\Ud83d\Ude18",
"\Ud83c\Udf55",
"\Ud83c\Udf2d",
"\Ud83c\Udf56",
"\Ud83c\Udf4f",
"\Ud83c\Udf50",
"\Ud83c\Udf4b",
"\Ud83c\Udf4a",
"\Ud83d\Udc2f",
"\Ud83c\Udf46",
"\Ud83d\Udc3d",
"\Ud83d\Ude4a"
)
ARRAY AMOUNT EQUALS = 30
Full 
IN THE LOOP - START PRINT


IN THE LOOP - END PRINT
IN THE LOOP - START PRINT


IN THE LOOP - END PRINT
.... ( LOTS OF OTHER PRINT STATEMENTS INSIDE LOOP)
ARRAY EQUALS aF= (
"\Ud83c\Udf55",
"\Ud83c\Udf55",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf52",
"\Ud83d\Ude18",
"\Ud83d\Ude43",
"\Ud83c\Udfc8",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83d\Ude44",
"\Ud83d\Ude0e",
"\Ud83e\Udd14",
"\Ud83d\Ude12",
"\Ud83d\Ude07",
"\Ud83d\Ude1c",
"\Ud83e\Udd11",
"\Ud83d\Ude17",
"\Ud83d\Ude18",
"\Ud83c\Udf55",
"\Ud83c\Udf2d",
"\Ud83c\Udf56",
"\Ud83c\Udf4f",
"\Ud83c\Udf50",
"\Ud83c\Udf4b",
"\Ud83c\Udf4a",
"\Ud83d\Udc2f",
"\Ud83c\Udf46",
"\Ud83d\Udc3d"
)
ARRAY AMOUNT EQUALS aF= 30

如您所见,尽管第一个表情符号与第二个表情符号完全相等,但它们在它们的unicode字符串中都是打印出来的,但它们不会通过检查它们是否相等,就好像它们有不同的字符串表示一样。由于当我不再从Xcode运行应用程序并选择两个相同的表情符号时,它们确实通过检查并打印“对已经存在的项进行同等添加”,因此我确信这个问题与从NSUserDefaults检索数据有关,即使我打印从NSUserDefaults获得的数组时,情况也完全一样。在从NSUserDefaults复制数组时,我尝试过多种方法,比如[[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];,甚至循环遍历NSUserDefaults数组,复制每个项,但是似乎没有什么能解决这个问题。请帮帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-26 10:58:18

中比较字符串的位置

if ( button.titleLabel.text == historicEmojiQueue[j] )

你应该用

if ( [button.titleLabel.text isEqualToString:historicEmojiQueue[j]] )

前者比较它们是否占用相同的内存,第二个比较它们是否匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35021454

复制
相关文章
Nginx代理HTTPS到Docker指定端口
假设我在服务器上的 Docker 运行了一个应用,在 Docker 启动的时候,我指定他监听了 localhost 的 9000 端口,定向到 Docker 的 9002 的应用上。
凝神长老
2020/04/17
1.8K0
详解https请求Nginx转发tomcat变成http问题
简单架构为nginx做负载均衡,后端用tomcat做容器。浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。
IT大咖说
2021/02/24
4.6K0
详解https请求Nginx转发tomcat变成http问题
python部署-nginx部署带docker的https请求
首先例如使用https://www.Se7eN_HOU.com进行首页访问,首先会先进入到主服务器里面,经过主服务器的Nginx Web服务器,进行web服务。这时主服务器的nginx就会监听80端口,收到这个请求
Se7eN_HOU
2020/04/24
1.2K0
Nginx配置SSL实现https请求并重定向http请求的实现
因为我的网站是部署在腾讯云上的,腾讯云同时也提供了免费的SSL证书(有效期1年)。
Bug生活2048
2018/08/31
3.9K0
Nginx配置SSL实现https请求并重定向http请求的实现
docker registry push错误“server gave HTTP response to HTTPS client”
上传报错 Docker execution failed   Command line [docker push xxx.xxx.xxx.xxx:5000/xxx:0.0.1-SNAPSHOT] returned:   Get https://xxx.xxx.xxx.xxx:5000/v1/_ping: http: server gave HTTP response to HTTPS client
似水的流年
2019/12/07
2.4K0
Nginx的默认端口是_https默认端口
我们首先用whereis nginx.conf来看一下哪些目录里面有nginx.conf文件,我们看到了一共有6个目录,这里是应该分别到这六个文件里面去看一下,但是由于我们提前找过了,是/etc/nginx这个目录,所以我们就直接到该目录下面,即采用cd来切换目录,下图已经把这个文件标出来了。
全栈程序员站长
2022/10/05
2.3K0
Nginx的默认端口是_https默认端口
nginx 全站 http 跳转 https
lukachen
2023/10/22
2820
nginx转发http请求
大家好,又见面了,我是你们的朋友全栈君。 原路径: http://source.server.com/callback/test/test?username=xx 转发到:http://10.1.9
全栈程序员站长
2022/11/02
9210
nginx转发https到http
微信小程序和公众号,要求外链的页面或API必须使用https。https意味着需要证书,在测试阶段,很不方便,因此部署的测试站点都是http。于是尝试在现有的https站点中,用nginx转发请求到只有http的测试站点。
全栈程序员站长
2022/11/02
2.1K0
Nginx请求转发&端口转发
nginx反向代理 官网介绍:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
mingjie
2022/05/12
4K0
Docker容器https请求报错
某一天,我在使用 docker 的时候遇到个奇怪的问题,在容器里面发起 https 请求报了个错。 经过测试发现在容器里面发起的所有 https 请求都报错,即使是 curl 发起 https 请求也报错。 而 http 请求却能正常发起请求。
epoos
2023/08/24
1.3K0
Docker容器https请求报错
Https网站中请求Http内容
今天遇到个问题:```Mixed Content: The page at ‘https://*****’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://*****’. This request has been blocked; the content must be served over HTTPS```
DannyHoo
2020/06/15
23.2K0
设置HTTP请求自动跳转HTTPS
server { listen 80; server_name localhost ; location / { index index.html index.htm; } } server { listen 443 ssl; server_name localhost; root html; index index.html index.htm; ssl_certificate cert/domain name.pem; #将domain name.pem替换成您证书的文件名。 ssl_certificate_key cert/domain name.key; #将domain name.key替换成您证书的密钥文件名。 ssl_session_timeout 5m;
1900
2022/12/03
2.6K0
编译nginx支持https+http2+nginx-http-concat模块
现在很多网站要求https访问,既能提高安全性,也避免运营商劫持。又必须给nginx加上这些功能。
保持热爱奔赴山海
2019/09/18
6900
nginx实现http自动跳转https
在使用 Nginx 作为 Web 服务器时,您可以通过配置实现 HTTP 自动跳转 HTTPS。这可以确保用户始终使用 HTTPS 访问您的网站,从而提高网站的安全性。
堕落飞鸟
2023/03/30
6.5K0
nginx从http跳转到https
项目前期使用http,后期为了安全方面的考虑,启用了https。 项目架构:前端使用nginx作为多个tomcat实例的反向代理和负载均衡。 实际上只需要在nginx上启用https即可,使客户端与nginx之后使用https方式通信,而nginx与tomcat之间依然以http方式通信。
编程随笔
2019/09/11
13.8K0
Nginx配置Https并进行Http强制跳转Https
首先我们先了解为什么要做https? https现在是一个趋势这样在别人去访问的时候是会显示一个安全的连接,可以去看看各大网站等… 先获取证书 这里就不介绍了 获取的地方有很多 可以进行正规渠道的购买或者使用openssl工具进行获取
互联网-小阿宇
2022/11/21
1.8K0
Nginx配置Https并进行Http强制跳转Https
Nginx实现http和https复用1个端口的2种解决方式
http是明文传输,数据在传输时没有加密,存在被读取和修改数据的风险,http传输敏感信息如密码等不够安全。
六月河
2023/06/26
10.2K0
Nginx实现http和https复用1个端口的2种解决方式
点击加载更多

相似问题

普通HTTP请求被发送到HTTPS端口(NGINX)

30

Nginx http到http重定向400普通HTTP请求被发送到HTTPS端口

17

处理nginx 400“简单的HTTP请求被发送到HTTPS端口”错误

101

aws >>上的nginx码头集装箱普通HTTP请求被发送到HTTPS端口

11

Chilkat HTTPS将普通HTTP请求发送到HTTPS端口

147
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文