重新加载数据后,根据要求在更新后未显示uicollectionview单元格

时间:2014-05-14 14:14:52

标签: ios iphone objective-c ipad uicollectionview

我有一个产品目录,显示在集合视图中,用户可以更改新产品的类别子类别,它们是完全填充集合视图

现在,用户可以选择任意特定产品的数量,数量为1,2,3或更多。 为此,我在集合视图单元格中设置了 UIButton 操作,以便在Cell中的 UITextfield 中输入用户输入。

一切都很完美,实际上我根据类别有不同数量的产品,大多数时候我必须滚动才能看到集合视图中的产品。< / p>

当设置任何产品或多个产品的数量时,它们就像我想要的每个 Cell 一样完美。

**更新问题:**

如果我更改类别或子类别以查看集合视图中的其他产品,那么此条件在 uibutton 操作方法和在 cellForItemAtIndexPath 方法中。 这是问题:

if ([code objectAtIndex:indexPath.row] == [updatedCodes objectAtIndex:i])
{} // this condition is creating problem on category or sub category change. 

我的工作方式:

自定义CollectionView类

@interface MyCell  : UICollectionViewCell
@property (retain, nonatomic) UIButton *btn1;
@property (retain, nonatomic) UITextField *txt1;
@end

实施

@implementation MyCell
@synthesize btn1, txt1;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
    CGRect btn1Rect = CGRectMake(190, 230 , 35 , 35);
    btn1 = [[UIButton alloc] initWithFrame:btn1Rect];
    btn1.tag=11;
    [btn1 setBackgroundImage:[UIImage imageNamed:@"BtnPlus.png"] forState:UIControlStateNormal];
    //btn1.layer.borderWidth = 1.0f;

    CGRect txt1Rect = CGRectMake(143, 230 , 45 , 30);
    txt1 = [[UITextField alloc] initWithFrame:txt1Rect];
    txt1.tag=13;
    txt1.font=[UIFont fontWithName:@"Superclarendon" size:18];
    txt1.textAlignment = NSTextAlignmentCenter;
    txt1.textColor = [UIColor blueColor];
    //txt1.layer.borderWidth = 1.0f;
 }
 return self;
}
ViewController实现中的

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellID" forIndexPath:indexPath];
[[cell btn1] addTarget:self action:@selector( btnPlus:event:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:cell.btn1];
cell.txt1.text = @"0";
for (i = 0; i < [updatedCodes count]; i++)
{
    if ([code objectAtIndex:indexPath.row] == [updatedCodes objectAtIndex:i])
    {
        cell.txt1.text = [updatedQty objectAtIndex:i];
     }
}
[cell.contentView addSubview:cell.txt1];
return cell;
}

UIButton Action Method

-(void)btnPlus:(id)sender event:(id)event
{
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:myCollection];
btnIndex = [myCollection indexPathForItemAtPoint: currentTouchPosition];
MyCell *cell = (MyCell*)[myCollection cellForItemAtIndexPath:btnIndex];
NSString *newCode = [code objectAtIndex:btnIndex.row];
NSString *newQty = cell.txt1.text;
if ([updatedCodes containsObject:newCode])
{
    for (i = 0; i < [updatedCodes count]; i ++)
    {
        if ([updatedCodes objectAtIndex:i] == newCode)
        {
            qnty = [newQty integerValue];
            qnty = qnty + 1;
            cell.txt1.text = [NSString stringWithFormat:@"%d", qnty];
            newQty = cell.txt1.text;
            [updatedQty replaceObjectAtIndex:i withObject:newQty];
        }
    }
    if (![indexPaths containsObject:btnIndex])
    {
        [indexPaths addObject:btnIndex];
    }
}
else
{
    [updatedCodes addObject:newCode];
    qnty = [newQty integerValue];
    qnty = qnty + 1;
    cell.txt1.text = [NSString stringWithFormat:@"%d", qnty];
    newQty = cell.txt1.text;
    [updatedQty addObject:newQty];
    if (![indexPaths containsObject:btnIndex])
    {
        [indexPaths addObject:btnIndex];
    }
}
[myCollection reloadItemsAtIndexPaths:indexPaths];
}

注意: Code,indexPaths,updatedCodes和updatedQty是 NSMutableArrays

非常感谢有关此问题的任何建议/帮助。

等待快速帮助...... :(

2 个答案:

答案 0 :(得分:0)

问题出在这里

if ([indexPaths count] > 0)
{
    for (i = 0; i < [updatedCodes count]; i++)
    {
        if ([code objectAtIndex:indexPath.row] == [updatedCodes objectAtIndex:i])
        {
            cell.txt1.text = [updatedQty objectAtIndex:i];
        }
    }
}

当这个数组有记录时,它会进入这个IF语句,并跳过你实际设置你的cell.txt1.text = @“0”的else语句。最简单的修复方法是在for循环之前放置下一行代码

cell.txt1.text = @"0";

喜欢这个

if ([indexPaths count] > 0)
    { 
        cell.txt1.text = @"0";
        for (i = 0; i < [updatedCodes count]; i++)
        {
            if ([code objectAtIndex:indexPath.row] == [updatedCodes objectAtIndex:i])
            {
                cell.txt1.text = [updatedQty objectAtIndex:i];
            }
        }
}

答案 1 :(得分:0)

回答你自己的问题可能并不好,但我想出了我的问题并自己解决了

所以在这里张贴问题给其他一些遭遇同样问题的人....

这是我在代码中改变的全部内容

视图控制器实现中的

if ([code objectAtIndex:indexPath.row] == [updatedCodes objectAtIndex:i])
{
    cell.txt1.text = [updatedQty objectAtIndex:i];
}

用这个

if ([[code objectAtIndex:indexPath.row] isEqualToString:[updatedCodes objectAtIndex:i]])
    {
        cell.txt1.text = [updatedQty objectAtIndex:i];
    }

和Button Action方法中的相同更改为

if ([newCode isEqualToString:[updatedCodes objectAtIndex:i]])
{
    // do something
}