3

カスタマイズした AQGridViewCell に ImageView でボタンを追加したいと考えています。編集ボタンをクリックすると、以下のように ImageGridViewCell に削除ボタンが表示されます。cellForItemAtIndexメソッドに削除ボタンを追加しました。ここに私のコード

 - (AQGridViewCell *) gridView: (AQGridView *) gridView cellForItemAtIndex: (NSUInteger) index
{
static NSString *photoCellIdentifier = @"IBImageGridViewCell";
IBImageGridViewCell *cell = (IBImageGridViewCell *)[self.gridView dequeueReusableCellWithIdentifier:photoCellIdentifier];
if (cell == nil) {
    cell = [[IBImageGridViewCell alloc] initWithFrame:CGRectMake(3.0, 3.0, 100.0, 120.0) reuseIdentifier:photoCellIdentifier];
    cell.selectionStyle = AQGridViewCellSelectionStyleNone;

}
PTKEntry *entry = [_objects objectAtIndex:index];

UIButton *deletebutton = [UIButton buttonWithType:UIButtonTypeCustom];
[deletebutton addTarget:self
                 action:@selector(deleteimage:)
       forControlEvents:UIControlEventTouchDown];

[deletebutton viewWithTag:index];

deletebutton.frame = CGRectMake(70,0,30,30);

UIImage * buttonImage = [UIImage imageNamed:@"delete.png"];

[deletebutton setImage:buttonImage forState:UIControlStateNormal];

if (self.gridView.editing) {
    deletebutton.hidden=NO;

}
else{
    deletebutton.hidden=YES;

}


[cell.contentView addSubview:deletebutton];
[cell.contentView bringSubviewToFront:deletebutton];


    if (entry.data && entry.data.photo) {

        cell.imageView.image = entry.data.photo;

        NSLog(@"load table");

    } else {

        cell.imageView.image = nil;
         NSLog(@"Not load table");
    }



return cell;
}

ビューの読み込み時に削除ボタンが表示されなかったとき。削除ボタンをクリックすると、各グリッドセルの削除が表示され、削除ボタンがグリッドから非表示にならなかった完了ボタンをクリックします ここでセルビューを表示私のイメージ

4

2 に答える 2

0

AQGridView でデリゲート メソッドを作成し、次のようにクラスに実装できます。

-(void) gridView:(AQGridView *)gridView didSelectItemAtIndex:(NSUInteger)index

これはデリゲート メソッドのアプローチです。デリゲートメソッドを作成する場合

-(void) gridView:(AQGridView *)argGridView deleteCell:(AQGridViewCell *)cell atIndex:(NSUInteger)index; 

これは、削除ボタンをクリックすると didSelectItemAtIndex: として呼び出されます。

これを行うには、次の手順に従います。

メソッド canHideDelete: を追加して、カスタム セル IBImageGridViewCell の削除ボタンを表示および非表示にします。指定したセルをクリックすると、[cell canHideDelete:NO] で削除ボタンが表示されます。IBImageGridViewCell で、

指定したセルを削除するブロックを作成できます。これを行うには、拡張 AQGridViewCell_Extension.h を AQGridViewCell のように作成します。

#import "AQGridViewCell.h"

typedef void(^AQGridViewCellDeleteBlock)(AQGridViewCell*);

@interface AQGridViewCell ()

@property(nonatomic, copy) AQGridViewCellDeleteBlock deleteBlock;

@end

IBImageGridViewCell.m および AQGridView.m に「AQGridViewCell_Extension.h」をインポートします。

次に、削除ボタンを処理するセレクターを作成し、ブロックを呼び出してセルを削除します。

    -(void)deleteButtonAction
{
    self.deleteBlock(self);
}

セルを削除するためにクラスに実装するデリゲート メソッドを作成します これを @protocol AQGridViewDelegate の下の AQGridView.h に追加します

-(void) gridView:(AQGridView*) gridView deleteCell:(AQGridViewCell*) セル atIndex:(NSUInteger) インデックス; ここで、AQGridView.m でメソッドを変更します。

- (AQGridViewCell *) createPreparedCellForIndex: (NSUInteger) index usingGridData: (AQGridViewData *) gridData
{
    [UIView setAnimationsEnabled: NO];
    AQGridViewCell * cell = [_dataSource gridView: self cellForItemAtIndex: index];
    cell.separatorStyle = _flags.separatorStyle;
    cell.editing = self.editing;
    cell.displayIndex = index;

    cell.frame = [self fixCellFrame: cell.frame forGridRect: [gridData cellRectAtIndex: index]];
    if ( _backgroundView.superview == self )
        [self insertSubview: cell aboveSubview: _backgroundView];
    else
        [self insertSubview: cell atIndex: 0];
    [UIView setAnimationsEnabled: YES];
    __block AQGridView *localAQGridView = self;
    // DELETE BUTTON BLOCK - TO CALL DELEGATE METHOD
    cell.deleteBlock = ^(AQGridViewCell *argCell)
    {
        NSInteger index = [localAQGridView indexForCell:argCell];
        //NSLog(@"Cell to be deleted is %d", index);
        [localAQGridView.delegate gridView:localAQGridView deleteCell:argCell atIndex:index];

    };

    return ( cell );
}

クラス内のセルを削除するには、次のメソッドを実装します

-(void) gridView:(AQGridView *)argGridView deleteCell:(AQGridViewCell *)cell atIndex:(NSUInteger)index
{
    NSLog(@"ON deleting cell at %d", index);
    [mediaItemsArray removeObjectAtIndex:index];
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:index];

    [argGridView beginUpdates];
    [argGridView deleteItemsAtIndices:indexSet withAnimation:AQGridViewItemAnimationFade];
    [argGridView endUpdates];

}

これがお役に立てば幸いです。

于 2013-10-05T11:43:56.627 に答える
0

AQGridView クラスを変更せずにそれを行う別の方法

IBImageGridViewCell.xib ファイルに削除ボタンを追加し、IBImageGridViewCell.h を次のように変更します。

@class IBImageGridViewCell;
@protocol CustomGridCellViewDelegate<NSObject>

@optional

-(void) onDeleteButtonTouched:(IBImageGridViewCell *)sender;

@end


@interface IBImageGridViewCell : AQGridViewCell

+ (id) cellFromNib;

@property (nonatomic,assign) id <CustomGridCellViewDelegate> delegate;

@property (nonatomic, readonly, retain) IBOutlet UIView *contentView;

@property (weak, nonatomic) IBOutlet UIButton *deleteButton;

@property (nonatomic, copy) NSString *reuseIdentifier;

- (IBAction)deleteButtonAction:(UIButton *)sender;

@end

IBImageGridViewCell.m ファイルに追加します

- (IBAction)deleteButtonAction:(UIButton *)sender
{
    [self.delegate onDeleteButtonTouched:self];
}

mainViewController.h にデリゲートを追加します

@interface mainViewController : UIViewController<CustomGridCellViewDelegate>

mainViewController.m ファイルで

メソッドでは

- (AQGridViewCell *) gridView: (AQGridView *) gridView cellForItemAtIndex: (NSUInteger) index

追加

cell.delegate=self;
cell.deleteButton.tag =index;

削除ボタン アクションを処理する

-(void)onDeleteButtonTouched:(NTGridViewCell *)sender
{
    NSLog(@"Selected Button:%d",sender.deleteButton.tag);
    [yourArrayList removeObjectAtIndex:sender.deleteButton.tag];
    [self.gridView reloadData];

    //***Animated delete 
//    [yourArrayList removeObjectAtIndex:sender.deleteButton.tag];
//    NSIndexSet* set = [NSIndexSet indexSetWithIndex:sender.deleteButton.tag];
//    [self.gridView beginUpdates];
//    [self.gridView deleteItemsAtIndices:set  withAnimation:AQGridViewItemAnimationFade];
//    [self.gridView endUpdates];
}
于 2013-11-26T12:56:36.033 に答える