2013-10-25 42 views
0

我有一个自定义类(FFFuelQuantityPickerVC)故事板视图控制器包含UIPickerView和UIButton。 UIButton连接到FFFuelQuantityPickerVC中称为fullButtonPressed的IBAction。当这个视图控制器使用storyboard popover segue来呈现时,当UIButton被“触摸到内部”时,fullButtonPressed IBAction被触发。为什么不是我的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 
+0

在这里你触发你的按钮动作..只要把你的代码触发你的按钮动作。当你点击你的单元格时,你需要UIPopoverController ..我是正确的。 – TamilKing

+0

我不知道我跟着你。 IBAction方法位于FFFuelQuantityPickerVC视图控制器中。 self.poc _is_是UIPopoverController,通过更改其contentViewController来重用。 – MTT727

回答

0

这是我的代码。我米使用此代码显示UIPopoverController当我点击单元格并从挑值UIPickerView的UITableViewCell

-(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]; 
     } 
    } 
+0

我的ViewController的选择器部分工作正常 - 按预期调用委托方法pickerView:didSelectRow:inComponent:。这是在ViewController视图中连接到我的UIButton的IBAction方法,它没有被触发。 – MTT727

+0

请放在你触发按钮的地方。 – TamilKing

+0

我已将VC代码添加到原始问题中。 – MTT727

0

来显示的UILabel的价值对于那些我不清楚原因, UI Button没有收到推送 - 它从未突出显示。它没有被我能看到的另一种观点覆盖(唯一的另一种观点是选择器)。无论如何,我添加了一个UIToolbar,并将按钮更改为条形按钮项目,并且工作正常。

相关问题