美团知识点

本文主要探讨了美团在技术创新和业务实践中的关键知识点,涵盖了从后台系统到前端交互的多个层面,揭示了美团如何通过技术手段提升用户体验和服务效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    // 拉伸
    self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg_dealcell"]];
    // 平铺
    self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg_dealcell"]];
保留两位小数
    // 现价
    self.currentPriceLabel.text = [NSString stringWithFormat:@"¥ %@", deal.current_price];
    NSUInteger dotLoc = [self.currentPriceLabel.text rangeOfString:@"."].location;
    if (dotLoc != NSNotFound) {
        // 超过2位小数
        if (self.currentPriceLabel.text.length - dotLoc > 3) {
            self.currentPriceLabel.text = [self.currentPriceLabel.text substringToIndex:dotLoc + 3];
        }
    }
//当我们想要删除某个一样的东西时,删除的是内存一样的,但是我们要求的是删除内容一样,这样remove不执行,所以我们重写这个东西的isEqual方法。
- (BOOL)isEqual:(MTDeal *)other
{
    return [self.deal_id isEqual:other.deal_id];
}
使用fmdb要用导入libsqlite3.tbd
cell会有复用,当上下滑动tableView或者collectionView的时候,前后cell会复用,导致很多错误现象出现,我们需要把这个东西写在模型里面,通过控制模型的属性来控制cell的样式
例如在- (void)setDeal:(MTDeal *)deal中,这么写
    // 根据模型属性来控制cover的显示和隐藏
    self.cover.hidden = !deal.isEditting;

    // 根据模型属性来控制打钩的显示和隐藏
    self.checkView.hidden = !deal.isChecking;
因为上下拉动tableview或者collectionView的时候会加载这个方法来获得内容,那我们只要让他和model绑定就不出现这个错误了

//防止多次加载数据,返回回来的数据可能是上一次的,用最后一个reuqest表明
//请求数据以后
if (request != self.lastRequest) return;
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    // 计算一遍内边距
    [self viewWillTransitionToSize:CGSizeMake(collectionView.width, 0) withTransitionCoordinator:nil];

    //因为数据请求完(成功)都会重新布局,所以我们在这里将数据请求完界面的变化写在这里

    // 控制尾部刷新控件的显示和隐藏
    self.collectionView.footerHidden = (self.totalCount == self.deals.count);

    // 控制"没有数据"的提醒
    self.noDataView.hidden = (self.deals.count != 0);
    return self.deals.count;
}
//比较两个NSDate之间的时间差
    // 设置剩余时间
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd";
    NSDate *dead = [fmt dateFromString:self.deal.purchase_deadline];
    // 追加1天
    dead = [dead dateByAddingTimeInterval:24 * 60 * 60];
    NSDate *now = [NSDate date];
    //比较两个NSDate之间的时间差
    NSCalendarUnit unit = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
    NSDateComponents *cmps = [[NSCalendar currentCalendar] components:unit fromDate:now toDate:dead options:0];
    if (cmps.day > 365) {
        [self.leftTimeButton setTitle:@"一年内不过期" forState:UIControlStateNormal];
    } else {
        [self.leftTimeButton setTitle:[NSString stringWithFormat:@"%ld天%ld小时%ld分钟", (long)cmps.day, (long)cmps.hour, (long)cmps.minute] forState:UIControlStateNormal];
    }
涉及到数据库的用工具类,提供方法即可
将一个模型存到数据库中,要将这个模型转为NSData才行,
例如添加一个收藏时:
+ (void)addCollectDeal:(MTDeal *)deal
{
    //存到数据库中,要先转换为NSData才可以的
    //这里就是为什么MTDeal要实现NSCoding
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:deal];

    [_db executeUpdateWithFormat:@"INSERT INTO t_collect_deal(deal, deal_id) VALUES(%@, %@);", data, deal.deal_id];
}
当很多控制器的形式一样的时候,写一个基类控制器,布局啊请求方式啊都一样,设置传递参数不一样即可
MJRefresh中,
//进入下拉刷新状态, 发送请求给服务器
    [self.collectionView headerBeginRefreshing];

当headerFresh进入状态的时候回主动请求数据
AutoresizingMask

UIViewAutoresizingNone                   不自动调整。
UIViewAutoresizingFlexibleLeftMargin     自动调整view与父视图左边距,以保证右边距不变
UIViewAutoresizingFlexibleWidth          自动调整view的宽度,保证左边距和右边距不变
UIViewAutoresizingFlexibleRightMargin    自动调整view与父视图右边距,以保证左边距不变
UIViewAutoresizingFlexibleTopMargin      自动调整view与父视图上边距,以保证下边距不变
UIViewAutoresizingFlexibleHeight         自动调整view的高度,以保证上边距和下边距不变
UIViewAutoresizingFlexibleBottomMargin   自动调整view与父视图下边距,以保证上边距不变
当导航栏的几个按钮UIBarbutton的间距太小时,设置这些item的宽度大一点,图片还是居中,这样就可以了
[self addChildViewController:citySearchResult];
[self.view addSubview:citySearchResult.view];
    /**
     *  2.使用谓词过滤器
        // 谓词\过滤器:能利用一定的条件从一个数组中过滤出想要的数据
     */
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@ or pinYin contains %@ or pinYinHead contains %@", searchText, searchText, searchText];

    //从所有的城市数组中过滤出符合条件的
    self.resultCities = [[MTMetaTool cities] filteredArrayUsingPredicate:predicate];

    //刷新tableView
    [self.tableView reloadData];
假如说一个控制器是present出来的,那么他也是要自己dismiss掉,[self dismiss...];是自己dismiss,而不是把你present出来的那个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值