UIMenuController аварийно завершает работу приложения при повторном использовании ячейки

Я новичок в использовании UIMenuController . Я сделал UIMenuController при длительном нажатии UITableViewCell. Он работает нормально, пока ячейки не используются повторно. Когда я прокручиваю представление таблицы, и ячейки используются повторно, длительное нажатие на ячейку приводит к сбою приложения. Ошибка отображается в строке - [ячейка становится первым ответчиком].

Мой код-

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{    
    // Standard bubble

    NSBubbleData *data = [[self.bubbleSection objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    static NSString *cellId1 = @"tblBubbleCell";
    UIBubbleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId1];
    if (cell == nil) cell = [[UIBubbleTableViewCell alloc] init];
    cell.data = data;
    cell.key=data.key;
    cell.showAvatar = self.showAvatars;

    UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    [cell addGestureRecognizer:recognizer];
    return cell;
}


#pragma mark - Menu controller

- (void)longPress:(UILongPressGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
       UIBubbleTableViewCell *referenceCell = (UIBubbleTableViewCell *)recognizer.view;
       [referenceCell becomeFirstResponder];//error line when cell is reused and long  pressed

   UIMenuItem *forward = [[UIMenuItem alloc] initWithTitle:@"Forward" action:@selector(forward:)];

    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setMenuItems:[NSArray arrayWithObjects:forward, nil]];
    [menu setTargetRect:referenceCell.frame inView:referenceCell.superview];
    [menu setMenuVisible:YES animated:YES];
}
}

- (void)copy:(id)sender {
    NSLog(@"Cell is copied");
    }

- (void)delete:(id)sender {

    }

- (void)forward:(id)sender {
    NSLog(@"Cell forwarded");
   }

Я застрял в этой проблеме с некоторого времени. Пожалуйста помоги.

Код внутри UIBubbleTableViewCell есть->

@implementation UIBubbleTableViewCell

@synthesize data = _data;
@synthesize customView = _customView;
@synthesize bubbleImage = _bubbleImage;
@synthesize showAvatar = _showAvatar;
@synthesize avatarImage = _avatarImage;
@synthesize userName=_userName;
@synthesize key=_key;

- (BOOL)canBecomeFirstResponder {
   return YES;
}

- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
[self setupInternalData];
}

#if !__has_feature(objc_arc)
- (void) dealloc
{
  self.data = nil;
  self.customView = nil;
  self.bubbleImage = nil;
  self.avatarImage = nil;
  [super dealloc];
}
#endif

- (void)setDataInternal:(NSBubbleData *)value
{
self.data = value;
[self setupInternalData];
}

- (void) setupInternalData
{
   self.selectionStyle = UITableViewCellSelectionStyleNone;

   if (!self.bubbleImage)
   {
   #if !__has_feature(objc_arc)
    self.bubbleImage = [[[UIImageView alloc] init] autorelease];
   #else
    self.bubbleImage = [[UIImageView alloc] init];        
   #endif
    [self addSubview:self.bubbleImage];
   }

   NSBubbleType type = self.data.type;

   CGFloat width = self.data.view.frame.size.width;
   CGFloat height = self.data.view.frame.size.height;

   CGFloat x = (type == BubbleTypeSomeoneElse) ? 0 : self.frame.size.width - width -   self.data.insets.left - self.data.insets.right;
   CGFloat y = 0;

   // Adjusting the x coordinate for avatar
   if (self.showAvatar)
    {
    [self.avatarImage removeFromSuperview];
    #if !__has_feature(objc_arc)
    self.avatarImage = [[[UIImageView alloc] initWithImage:(self.data.avatar ?      self.data.avatar : [UIImage imageNamed:@"missingAvatar.png"])] autorelease];
    #else
    self.avatarImage = [[UIImageView alloc] initWithImage:(self.data.avatar ?   self.data.avatar : [UIImage imageNamed:@"missingAvatar.png"])];
    #endif
    self.avatarImage.layer.cornerRadius = 9.0;
    self.avatarImage.layer.masksToBounds = YES;
    self.avatarImage.layer.borderColor = [UIColor colorWithWhite:0.0 alpha:0.2].CGColor;
    self.avatarImage.layer.borderWidth = 1.0;

    CGFloat avatarX = (type == BubbleTypeSomeoneElse) ? 2 : self.frame.size.width - 52;
    CGFloat avatarY = self.frame.size.height - 50;

    self.avatarImage.frame = CGRectMake(avatarX, avatarY, 50, 50);
    [self addSubview:self.avatarImage];

    CGFloat delta = self.frame.size.height - (self.data.insets.top + self.data.insets.bottom + self.data.view.frame.size.height);
    if (delta > 0) y = delta;

    if (type == BubbleTypeSomeoneElse) x += 54;
    if (type == BubbleTypeMine) x -= 54;
}

[self.customView removeFromSuperview];
self.customView = self.data.view;
self.customView.frame = CGRectMake(x + self.data.insets.left, y +     self.data.insets.top, width, height);
[self.contentView addSubview:self.customView];

if (type == BubbleTypeSomeoneElse)
{
    self.bubbleImage.image = [[UIImage imageNamed:@"bubbleSomeone.png"] stretchableImageWithLeftCapWidth:21 topCapHeight:14];

}
else {
    self.bubbleImage.image = [[UIImage imageNamed:@"bubbleMine.png"] stretchableImageWithLeftCapWidth:15 topCapHeight:14];
}
self.bubbleImage.frame = CGRectMake(x, y, width + self.data.insets.left +   self.data.insets.right, height + self.data.insets.top + self.data.insets.bottom);

}


@end

person Jagveer Singh Rajput    schedule 14.03.2014    source источник
comment
какую ошибку вы получили в этом случае ??   -  person svrushal    schedule 14.03.2014
comment
не показывает никаких ошибок, приложение просто вылетает, указывая на строку - [referenceCell становитсяFirstResponder]   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
эта ошибка возникает только тогда, когда я долго нажимаю на ячейку, а затем прокручиваю таблицу и долго нажимаю на другую ячейку.   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
Я попробовал ваш код. но это не сбой. Единственная разница в том, что я пытался использовать UITableViewCell вместо UIBubbleTableViewCell.   -  person svrushal    schedule 14.03.2014
comment
Что содержит UIBubbleTableViewCell. Означает, какие подпредставления вы добавляете к нему.   -  person svrushal    schedule 14.03.2014
comment
но я должен использовать UIBubbleTableViewCell, я сделал пользовательские представления.   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
давайте продолжим это обсуждение в чате   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
Да, я понимаю. Но теперь я хочу добавить просмотры, которые вы добавили к нему.   -  person svrushal    schedule 14.03.2014
comment
if ([referenceCell responsesToSelector:@selector(becomeFirstResponder)]) { [referenceCell beFirstResponder]; } попробуй это   -  person Pawan Rai    schedule 14.03.2014
comment
@pawan это не работает. Та же проблема.   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
@svrushal я вставил код UIBubbleTableViewCell.m в свой вопрос   -  person Jagveer Singh Rajput    schedule 14.03.2014
comment
Извините, но мне нужен файл .h UIBubbleTableViewCell   -  person svrushal    schedule 14.03.2014
comment
Вы приняли ответ, значит, вы решили проблему?? В чем проблема??   -  person svrushal    schedule 14.03.2014


Ответы (1)


Попробуйте это вместо этого:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{    
    // Standard bubble

    NSBubbleData *data = [[self.bubbleSection objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    static NSString *cellId1 = @"tblBubbleCell";
    UIBubbleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId1];
    if (cell == nil) {
        cell = [[UIBubbleTableViewCell alloc] init];
        UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
        [cell addGestureRecognizer:recognizer];
    }

    cell.data = data;
    cell.key=data.key;
    cell.showAvatar = self.showAvatars;

    return cell;
}

Я не знаю, вызывает ли это вашу проблему, но вам нужно добавить распознаватель жестов в каждую ячейку только один раз. Кроме того, вам, вероятно, следует использовать initWithStyle: в подклассе вашей ячейки.

person MusiGenesis    schedule 14.03.2014
comment
Это не решает мою проблему. Хорошо, теперь я буду использовать initWithStyle: и дам вам знать. - person Jagveer Singh Rajput; 14.03.2014
comment
не могли бы вы добавить файл UIBubbleTableViewCell.h в свой код, чтобы мы попытались выяснить причину - person svrushal; 14.03.2014
comment
спасибо, теперь это работает после помещения ячейки = [[UIBubbleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId1]; - person Jagveer Singh Rajput; 14.03.2014