Отклонить всплывающее окно, когда я коснусь строки в представлении таблицы - PullRequest
2 голосов
/ 27 февраля 2012

Я работаю над контроллером Popover, где я создаю элемент управления popover одним нажатием кнопки, а затем перехожу к классу, где он отображает табличное представление в классе popover.

Здесь я хочу отключить всплывающее окно, когда я нажимаю на строку представления таблицы.

Вот мой код:

//popoverclass.h
UIPopoverController *popover; 
@property(nonatomic,retain)IBOutlet UIPopoverController *popover;

//popoverclass.m
-(IBAction)ClickNext
{
    ClassPopDismiss *classCourse = [[ClassPopDismiss alloc] init];
    popover = [[UIPopoverController alloc] initWithContentViewController:classCourse];
    popover.delegate = self;
    [popover presentPopoverFromRect:CGRectMake(50,-40, 200, 300) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
    [classCourse release];

}

//ClassPopDismiss.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    PopOverClass *objclass=[[PopOverClass alloc]init];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
  [objclass.popover dismissPopoverAnimated:YES];

}

Приведенный выше код не работает.

Ответы [ 3 ]

9 голосов
/ 27 февраля 2012

Невозможно отклонить popover из того же класса, потому что popover представлен из класса popoverclass.m, а ваша таблица находится в ClassPopDismiss.m.

Так что лучший вариант - иметь пользовательский делегатметод в вашем ClassPopDismiss.h:

// ClassPopDismiss.h
@protocol DismissDelegate <NSObject>

-(void)didTap;

@end

И установите id <DismissDelegate> delegate; в вашем @interface разделе.

Позвоните didTap, чтобы сообщить PopOverClass, что tableView нажата,

// ClassPopDismiss.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    [delegate didTap];
}

В вашем popoverclass.h:

@interface PopOverClass : UIViewController <DismissDelegate>

В вашем popoverclass.m не забудьте назначить делегата на self.Как:

ClassPopDismiss *classpop = [[ClassPopDismiss alloc]init];
classpop.delegate=self;

И при использовании метода протокола:

-(void)didTap
{
    //Dismiss your popover here;
    [popover dismissPopoverAnimated:YES];
}
0 голосов
/ 12 июня 2014

Небольшое обновление кода для этого (imho):

// firstViewController.h
@interface firstViewController : UIViewController <SecondDelegate>
{
   SecondViewController *choice;
}

// firstViewController.m
- (void)choicePicked(NSString *)choice
{
   NSLog(choice);
   [_popover dismissPopoverAnimated:YES]; //(put it here)
   _popover = nil; (deallocate the popover)
   _choicePicker = nil; (deallocate the SecondViewController instance)
}

// secondViewController.h (the one that will give back the data)
@protocol SecondDelegate <NSObject>
- (void)choicePicked:(NSString *)choice;
@end
@interface secondViewController : UITableViewController
@property (nonatomic, assign) id <SecondDelegate> delegate;
@end

// secondViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *selection = [_yourArray objectAtIndex:indexPath.row];
    [[self delegate] choicePicked:selection];
}
0 голосов
/ 27 февраля 2012
if(popover != nil) {
    [popover dismissPopoverAnimated:YES];
}

То, что вы делаете, - это выделение нового поповера и его немедленное отклонение, которое не работает.

...