在 UIBarButtonItem 内的 UIButton 周围显示弹出窗口
Displaying a popover around a UIButton inside UIBarButtonItem
当 userUIBtn
被点击时,userButtonPressed
以 UIButton
作为参数被调用。
但是,我想 访问 UIBarButtonItem
,以便在周围显示弹出窗口。
这里是generateToolbar()
方法,生成用户导航按钮。
-(void) generateToolbar {
// Initialize the `ButtonFactory`
ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];
// Generate some `UIButton(s)`
UIButton *userUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeUser];
userUIBtn.frame = CGRectMake(0,0,55,20);
// Add an action to the `UIButton`
[userUIBtn addTarget:self action:@selector(userButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
// Generate an `UIBarButtonItem` with the `UIButton` as basis view
UIBarButtonItem *userBtn = [[UIBarButtonItem alloc] initWithCustomView:userUIBtn];
// Add the `UIBarButtonItem` into the right side of the `navigationItem`
self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, nil];
}
这是 userButtonPressed()
方法,它通过按下 user 按钮触发,并在该按钮周围生成一个弹出窗口 - 它不是叫.
- (IBAction) userButtonPressed:(UIBarButtonItem*)sender {
// Initialize the `ButtonFactory`
ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];
// Generate some `UIButton(s)`
UIButton *feedbackUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeFeedback iconVisibility:YES textVisibility:YES capitalization:NO iconSize:20.0 textSize:20.0];
[feedbackUIBtn addTarget:self action:@selector(feedbackBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
feedbackUIBtn.frame = CGRectMake(0,50,300,50);
// Create a `UIViewController` and add the `UIButtons` as subviews
UIViewController *viewController = [[UIViewController alloc] init];
[viewController.view addSubview:feedbackUIBtn];
// Present the `UIViewController`
viewController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:viewController animated:YES completion:nil];
// Set up the `UIPopoverPresentationController`
UIPopoverPresentationController *popController = [viewController popoverPresentationController];
popController.permittedArrowDirections = UIPopoverArrowDirectionUp;
popController.barButtonItem = sender;
}
我的解决方案是在两个地方编辑动作处理程序,我将参数从 UIBarButtonItem
更改为 UIButton
,并将 popController.barButtonItem = sender;
更改为 popController.sourceView = sender;
。
- (IBAction) userButtonPressed:(UIButton*)sender {
...
popController.sourceView = sender;
...
}
userUIBtn
被点击时,userButtonPressed
以 UIButton
作为参数被调用。
但是,我想 访问 UIBarButtonItem
,以便在周围显示弹出窗口。
这里是generateToolbar()
方法,生成用户导航按钮。
-(void) generateToolbar {
// Initialize the `ButtonFactory`
ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];
// Generate some `UIButton(s)`
UIButton *userUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeUser];
userUIBtn.frame = CGRectMake(0,0,55,20);
// Add an action to the `UIButton`
[userUIBtn addTarget:self action:@selector(userButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
// Generate an `UIBarButtonItem` with the `UIButton` as basis view
UIBarButtonItem *userBtn = [[UIBarButtonItem alloc] initWithCustomView:userUIBtn];
// Add the `UIBarButtonItem` into the right side of the `navigationItem`
self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects: userBtn, nil];
}
这是 userButtonPressed()
方法,它通过按下 user 按钮触发,并在该按钮周围生成一个弹出窗口 - 它不是叫.
- (IBAction) userButtonPressed:(UIBarButtonItem*)sender {
// Initialize the `ButtonFactory`
ButtonFactory *buttonFactory = [[ButtonFactory alloc] init];
// Generate some `UIButton(s)`
UIButton *feedbackUIBtn = [buttonFactory createButtonWithButtonType:ButtonTypeFeedback iconVisibility:YES textVisibility:YES capitalization:NO iconSize:20.0 textSize:20.0];
[feedbackUIBtn addTarget:self action:@selector(feedbackBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
feedbackUIBtn.frame = CGRectMake(0,50,300,50);
// Create a `UIViewController` and add the `UIButtons` as subviews
UIViewController *viewController = [[UIViewController alloc] init];
[viewController.view addSubview:feedbackUIBtn];
// Present the `UIViewController`
viewController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:viewController animated:YES completion:nil];
// Set up the `UIPopoverPresentationController`
UIPopoverPresentationController *popController = [viewController popoverPresentationController];
popController.permittedArrowDirections = UIPopoverArrowDirectionUp;
popController.barButtonItem = sender;
}
我的解决方案是在两个地方编辑动作处理程序,我将参数从 UIBarButtonItem
更改为 UIButton
,并将 popController.barButtonItem = sender;
更改为 popController.sourceView = sender;
。
- (IBAction) userButtonPressed:(UIButton*)sender {
...
popController.sourceView = sender;
...
}