2013-04-10 30 views
0

我在我的应用中有几个UIPopover s,其中包含UITableView s。所有人在被解雇时都会发送消息popoverControllerDidDismissPopover:。当某个特定的popover被解散时,我想要将所有用户的选择都移动到UITextView确定哪个UIPopover控制器已被解雇

我不能这样做,除非我知道哪个popover正在被解雇。任何想法我可以做到这一点?

UIViewController* popoverContent = [[UIViewController alloc] init]; 

    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 416)]; // was 216 
    popoverView.backgroundColor = [UIColor redColor]; 
    popoverContent.contentSizeForViewInPopover = CGSizeMake(300.0, 416.0); 

    // define UITableView 
    tvServices = [[UITableView alloc] init]; 
    tvServices.frame = CGRectMake(0, 0, 300, 416); 
    tvServices.tag = 1201; 

    tvServices.delegate = self; 
    tvServices.dataSource = self; 

    // add it to the popover 
    [popoverView addSubview:tvServices]; 
    popoverContent.view = popoverView; 
    popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; 
    popoverController.delegate = (id)self; 
    [popoverController setPopoverContentSize:CGSizeMake(300, 416) animated:NO]; 

    // show it next to services textbox 
    [popoverController presentPopoverFromRect:soServices.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 
} 
+1

您可以在代理的方法'勾选驳回UIPopover做到这一点 - (无效)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController'那么你可以通过isKindOfClass检查:或等同标签。 – 2013-04-10 21:51:24

回答

2

popoverControllerDidDismissPopover:委托方法告诉你哪个弹出被解除。从那里你可以根据需要查看popover的contentViewController

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    UITableViewController *controller = (UITableViewController *)popoverController.contentViewController; 

    UITableView *tableView = controller.tableView; 
} 

这应该指出你在正确的目录。但是你不应该需要访问表视图。您正在访问视图控制器中的数据,而不是表格视图。

+0

嗨马迪...我没有看到任何可以识别控制器时使用** contentViewController ** ...你有什么想法? – SpokaneDude 2013-04-10 21:56:38

+1

您可以检查内容视图控制器的类,也可以在视图控制器的视图上设置标签。如果你有共同的处理,那么更好的方法就是定义一个协议,以使所有这些视图控制器都符合。然后你可以使用协议方法来询问视图控制器。 – rmaddy 2013-04-10 22:06:15

+0

我需要进入控制器内部以查看哪个UITableView在那里......但当然,没有任何我知道的事情会告诉我UITableView何时在UIPopover中消失。 – SpokaneDude 2013-04-10 22:12:20

1

你应该做它周围的其他方法:

的控制器,你现在应该使用代表团通知开始演示控制器。

在您的弹出窗口控制器中,向委托人(呈现控制器)发送消息以通知其选择/取消选择。


#import "ViewController.h" 
#import "QuestionGroupViewController.h" 

@interface ViewController() <QuestionGroupViewControllerDelegate> 
@end 

@implementation ViewController 

- (IBAction)presentQuestionnaire:(id)sender { 

    NSArray *q = @[@{@"question" : @"what cities would you like to visit?" , @"answers": @[@"Paris", @"barcelona", @"Istanbul"]}]; 

     QuestionGroupViewController *qvc = [QuestionGroupViewController new]; 
     qvc.delegate = self; 
     qvc.questions = q; 
     [self presentViewController:qvc animated:YES completion:NULL]; 
    } 
} 

-(void)selectedAnswer:(NSString *)answer forQuestion:(NSString *)question 
{ 
    NSLog(@"selectedt\t\t%@: %@", question, answer); 
} 
-(void)deSelectedAnswer:(NSString *)answer forQuestion:(NSString *)question 
{ 
    NSLog(@"deselectedt\t\t%@: %@", question, answer); 
} 
@end 

#import <Foundation/Foundation.h>  
@protocol QuestionGroupViewControllerDelegate<NSObject> 
-(void) selectedAnswer:(NSString *)answer forQuestion:(NSString *) question; 
-(void) deSelectedAnswer:(NSString *)answer forQuestion:(NSString *) question; 

@end 

@interface QuestionGroupViewController : UITableViewController 

@property (nonatomic, strong) NSArray *questions; 
@property (nonatomic, weak) id<QuestionGroupViewControllerDelegate> delegate; 
@end 

#import "QuestionGroupViewController.h" 


@interface QuestionGroupViewController() 
@property (nonatomic, strong) NSMutableArray *selectedCells; 

@end 


@implementation QuestionGroupViewController { 

} 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.selectedCells = [NSMutableArray array]; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [self.questions count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return [self.questions[section][@"answers"] count] +1 ; 

} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    return self.questions[section][@"question"]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *identifier [email protected]"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if(!cell){ 
     cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:identifier]; 

    } 
    if (indexPath.row == [self.questions[indexPath.section][@"answers"] count]) { 
     cell.textLabel.text = @"done"; 
    } else { 
     cell.textLabel.text = [[self.questions objectAtIndex:indexPath.section][@"answers"] objectAtIndex:indexPath.row]; 
    } 


    return cell; 
} 


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (indexPath.row == [self.questions[indexPath.section][@"answers"] count]) { 
     [self dismissViewControllerAnimated:YES completion:NULL]; 
     return; 
    } 

    NSString *answer = self.questions[indexPath.section][@"answers"][indexPath.row]; 

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    if([self isRowSelectedOnTableView:tableView atIndexPath:indexPath]){ 
     [self.selectedCells removeObject:indexPath]; 

     cell.accessoryType = UITableViewCellAccessoryNone; 
     [self.delegate deSelectedAnswer: answer forQuestion:self.questions[indexPath.section][@"question"]]; 

    } else { 
     [self.selectedCells addObject:indexPath]; 

     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     [self.delegate selectedAnswer: answer forQuestion:self.questions[indexPath.section][@"question"]]; 

    } 

} 

-(BOOL)isRowSelectedOnTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath 
{ 
    return ([self.selectedCells containsObject:indexPath]) ? YES : NO; 
} 

@end 
0

如果你是从你的代码呈现popovers,那么你应该给他们一个参考。收到弹出式代理呼叫时,您只需检查哪个实例正被解散。听起来很简单,除非我错过了一些东西。

1

你应该popoverControllerDidDismissPopover:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    UITableView *tableView = (UITableView*)[popoverController.contentViewController.view viewWithTag:1201]; 
    if (tableView != nil) { 
     // here you know that this UIPopover has tvServices as you set its tag to 1201 
    } 
}