0

UIPickerView と UIButton を含むカスタム クラス (FFFuelQuantityPickerVC) Storyboard View Controller があります。UIButton は、FFFuelQuantityPickerVC で fullButtonPressed と呼ばれる IBAction に接続されています。このビュー コントローラーがストーリーボード ポップオーバー セグエを使用して表示される場合、UIButton が「内部で修正」されると、fullButtonPressed IBAction が起動されます。

ただし、プログラムで 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 に答える