-1

In RootViewController I have a button *flop1 that when clicked opens PopViewController through segue *segPop and when a selection is chosen and the popover closes, button *flop1 's image is changed.

我希望有多个按钮,例如 *flop1,每个按钮都可以由自己选择的图像填充,同时使用相同的 PopViewController。

我已经通过 seque *segPop2 将 *flop2 连接到同一个 PopViewController。

根视图控制器.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

if ([[segue identifier] isEqualToString:@"segPop"]) {
    currentPopoverSegue = (UIStoryboardPopoverSegue *)segue;
    pvc = [segue destinationViewController];
    [pvc setDelegate:self];
    [pvc setStrPassedValue:[tfUserText text]];
} else if ([[segue identifier] isEqualToString:@"segPop2"]) {
    currentPopoverSegue = (UIStoryboardPopoverSegue *)segue;
    pvc = [segue destinationViewController];
    [pvc setDelegate:self];
    [pvc setStrPassedValue:[tfUserText text]];
}
}

// PopViewControllerDelegate callback function
- (void)dismissPop:(NSString *)value {
NSString *imagefile;
imagefile = [NSString stringWithFormat:@"%@.png",value];
[flop1 setImage:[UIImage imageNamed:imagefile] forState:UIControlStateNormal];
[[currentPopoverSegue popoverController] dismissPopoverAnimated: YES]; // dismiss the popover
}

@end

如何在我的

- (void)dismissPop:(NSString *)value {

用新图像填充 *flop2 按钮,同时保持 *flop1 图像不变?

如果这一切看起来很混乱,我很抱歉,我的编程教育为零,并且正在通过模仿来尝试所有这些。

谢谢

4

1 回答 1

1

在这种方法中:

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

sender是指向调用 segue 的对象的指针(在您的情况下是按钮)。您可以在 popoverViewController 中定义一个属性:

@property (strong, nonatomic) UIButton* buttonThatInvokedMe;

将其设置为您的调用按钮prepareForSegue

[pvc setButtonThatInvokedMe:sender];

然后将其返回到修改后的 dismssPop:

- (void)dismissPop:(NSString *)value buttonThatInvokedPopover:(UIButton*)button {
    NSString *imagefile;
    imagefile = [NSString stringWithFormat:@"%@.png",value];
    [button setImage:[UIImage imageNamed:imagefile] forState:UIControlStateNormal];
    [[currentPopoverSegue popoverController] dismissPopoverAnimated: YES]; 
    // dismiss the popover
}

你会像这样从你的 popOverVC 调用它:

[self.delegate dismissPop:value button:buttonThatInvokedMe]

不需要...您if else还应该能够省去.if elseprepareForSegue

您需要使按钮指针传递类型保持一致以避免编译器警告。如果您确定 Segue 只会被 UIButton 类型调用,请更改您的 prepareForSegue 签名以对发送者进行类型转换:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton*)sender

另一种方法是将其保留为id类型,但将 popOverViewController 中的指针类型更改为id并将其传递回委托方法id- 但是您需要UIButton在调用setImage:forState方法之前将其类型化,因为这需要一个UIBUtton类型..

协议

为了使这一切在没有编译器警告的情况下工作,您还需要为dismissPop:委托方法声明一个协议或使用performSelector-type 方法来间接调用它。

于 2013-03-07T03:11:54.907 回答