0

我有一个自定义类 (FFFuelQuantityPickerVC) Storyboard View Controller,它包含一个 UIPickerView 和一个 UIButton。UIButton 连接到 FFFuelQuantityPickerVC 中名为 fullButtonPressed 的 IBAction。当这个 View Controller 使用 storyboard popover segue 呈现时,fullButtonPressed IBAction 会在 UIButton 被“触及内部”时触发。

但是,当我以编程方式初始化并在弹出窗口中显示 FFFuelQuantityPickerVC 时,按下 UIButton 不会触发 IBAction。为什么会这样?这是当按下 UITableViewCell 中的按钮时进行编程演示的代码。(self.poc 是一个可重复使用的弹出框控制器):

-(void)thisHelperPressed:(UIButton *)thisHelper inCell:(UITableViewCell *)thisCell{

    if ([thisHelper.titleLabel.text isEqualToString:@"FuelPicker"]){
        //init the fuel quantity picker VC
        FFFuelQuantityPickerVC *fuelQuantityPickerVC;
        fuelQuantityPickerVC =[[UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle:nil]
                         instantiateViewControllerWithIdentifier:@"FuelQuantityPickerVC"];
        fuelQuantityPickerVC.delegate = self;
        [self.poc setContentViewController:fuelQuantityPickerVC];
    } else if...
    }
    self.poc.delegate = self;

    //present it
    [self.poc presentPopoverFromRect:thisHelper.frame inView:thisCell permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    .    
    .
    .

这是FFFuelQuantityPickerVC:

//  FFFuelQuantityPickerVC.h
#import <UIKit/UIKit.h>

@protocol fuelPickerDelegate <NSObject>
-(void) fuelQuantityChangedL:(NSInteger) quantityL R:(NSInteger)quantityR;
@end

@interface FFFuelQuantityPickerVC : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
@property (weak, nonatomic) IBOutlet UIPickerView *thisPicker;
@property (nonatomic) NSString *fuelQuantityL;
@property (nonatomic) NSString *fuelQuantityR;

@property (nonatomic) id delegate;

- (IBAction)fullButtonPressed;  //this is wired to the button 

@end

//
//  FFFuelQuantityPickerVC.m
#import "FFFuelQuantityPickerVC.h"

#define FUEL_MIN 0
#define FUEL_MAX 146
#define LEFT_COMPONENT 0
#define RIGHT_COMPONENT 1

@interface FFFuelQuantityPickerVC ()

@end

@implementation FFFuelQuantityPickerVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (!self.fuelQuantityL){
    self.fuelQuantityL = [NSString stringWithFormat:@"%i", FUEL_MAX];
    }
    if (!self.fuelQuantityR){
        self.fuelQuantityR = [NSString stringWithFormat:@"%i", FUEL_MAX];
    }
}

//set selected row to current values, if any
- (void) viewDidAppear:(BOOL)animated {
        [self.thisPicker selectRow:FUEL_MAX - [self.fuelQuantityL intValue] inComponent:LEFT_COMPONENT animated:YES];
        [self.thisPicker selectRow:FUEL_MAX - [self.fuelQuantityR intValue] inComponent:RIGHT_COMPONENT animated:YES];

}

//this method does not get called when the button is pressed (except when the VC is presented via storyboard popover segue)
- (IBAction)fullButtonPressed { 
    self.fuelQuantityL = [NSString stringWithFormat:@"%i", FUEL_MAX];
    self.fuelQuantityR = [NSString stringWithFormat:@"%i", FUEL_MAX];
    [self.thisPicker selectRow:0 inComponent:0 animated:YES];
    [self.thisPicker selectRow:0 inComponent:1 animated:YES];
    [self.delegate fuelQuantityChangedL:[self.fuelQuantityL integerValue]
                                      R:[self.fuelQuantityR integerValue]];

}

#pragma mark - PickerViewDataSource delegate methods
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return (FUEL_MAX-FUEL_MIN + 1);
}

#pragma mark - PickerView delegate methods

 - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
     float myWidth = self.view.frame.size.width;
 if (component == 0) return myWidth / 3;
 return (myWidth * 2 / 3);
 }

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
    //TODO
    return 28;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [NSString stringWithFormat:@"%d", (FUEL_MAX)-row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if (component == LEFT_COMPONENT){
        self.fuelQuantityL = [NSString stringWithFormat:@"%i", FUEL_MAX - row];
    } else {
        self.fuelQuantityR = [NSString stringWithFormat:@"%i", FUEL_MAX - row];
    }
    [self.delegate fuelQuantityChangedL:[self.fuelQuantityL integerValue]
                                      R:[self.fuelQuantityR integerValue]];
}


@end
4

2 回答 2

0

这是我的代码。当我单击单元格并从UIPickerView中选择值以在我的UITableviewCell中显示 UILabel 中的值时,我正在使用此代码显示UIPopoverController

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0)
    {
        if (indexPath.row == 1)
        {
            //PopoverView controller.........................................................................
            UIViewController *popoverViewController = [[UIViewController alloc] init];

            //PopoverView....................................................................................
            UIView *popoverView = [[UIView alloc]init];
            [popoverView setBackgroundColor:[UIColor blackColor]];

            //Navigation bar and Barbutton items..............................................................
            UINavigationBar *navBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
            navBar.barStyle = UIBarStyleBlackTranslucent;

            UIBarButtonItem *btnDone = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doDone)];
            UIBarButtonItem *btnCancel = [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(doCancel)];

            UINavigationItem *navItem = [[UINavigationItem alloc]init];
            navItem.rightBarButtonItem = btnDone;
            navItem.leftBarButtonItem = btnCancel;

            navBar.items = [[NSArray alloc]initWithObjects:navItem, nil];
            [popoverView addSubview:navBar];

            //UIPickerView.....................................................................................
            UIPickerView *sortPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 50, 320, 180)];
            popoverViewController.contentSizeForViewInPopover = CGSizeMake(320, 230);
            sortPickerView.delegate = self;
            sortPickerView.dataSource = self;
            sortPickerView.showsSelectionIndicator = YES;
            [popoverView addSubview:sortPickerView];
            NSUserDefaults *ud1 = [NSUserDefaults standardUserDefaults];

            if ([ud1 objectForKey:@"languages"]) 
            {
                NSUInteger row1 = [languages indexOfObject:[ud1 objectForKey:@"languages"]];
                if (row1) 
                {
                    [sortPickerView selectRow:row1 inComponent:0 animated:YES];
                }   
            }
            else
            {
                [sortPickerView selectRow:0 inComponent:0 animated:YES]; 
            }

            CGRect popFrame = lbl_language.frame;
            popFrame.origin.y = popFrame.origin.y + popFrame.size.height + 70;
            popFrame.origin.x = popFrame.origin.x + 100;
            popoverViewController.view = popoverView;
            self.SortPopover = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
            [self.SortPopover presentPopoverFromRect:popFrame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        }
    }
于 2013-10-25T04:16:28.807 回答
0

由于我不清楚的原因,UI 按钮没有收到推送 - 它从未突出显示。它没有被我可以看到的另一个视图覆盖(唯一的另一个视图是选择器)。无论如何,我添加了一个 UIToolbar 并将按钮更改为一个栏按钮项,它工作正常。

于 2013-10-28T17:31:36.757 回答