【问题标题】:iOS display image on a popover depending on the UIButton clickediOS 在弹出窗口上显示图像,具体取决于单击的 UIButton
【发布时间】:2014-04-03 21:48:48
【问题描述】:

这就是我想要做的:

单击“信息 (i)”按钮时,我需要显示一个弹出框,左侧是图像,右侧是一些相关文本。

现在我们将后台视图称为“视图 1”,将弹出框称为“视图 2”。

View2Controller.h 如下所示:

@class View2Controller;
@protocol View2ControllerDelegate <NSObject>

- (void)infoPopover:(View2Controller *)obic loadImage: (NSString *)imageFilename;

@end

@interface View2Controller : UIViewController
@property (strong, nonatomic) IBOutlet UIImageView *imageInfo;
@property (strong, nonatomic) IBOutlet UILabel *textInfo;

@property (nonatomic, assign) id<View2ControllerDelegate> delegate;

@end

id <View2ControllerDelegate> _delegate;

现在 View1Controller.h 有这一行:

@interface View1Controller : UIViewController <View2ControllerDelegate>

View1Controller.m 的@implementation 看起来有点像这样

- (IBAction)showInfo:(id)sender {
UIButton *btn = (UIButton *)sender;

View2Controller *obic = [[View2Controller alloc]init];
[obic setDelegate:self];

switch (btn.tag) {
    case 1:
        [self infoPopover:obic loadImage:@"info1.png"];
        break;

    case 2:
        //Info View 2
        break;

    case 3:
        //Info View 3
        break;

    case 4:
        //Info View 4
        break;

    case 5:
        //Info View 5
        break;

    case 6:
        //Info View 6
        break;


    default:
        break;
}
}

- (void)infoPopover:(View2Controller *)obic loadImage:(NSString *)imageFilename
{
    [obic.imageInfo setImage:[UIImage imageNamed:imageFilename]];
}

我查阅了几篇关于代表如何工作的教程。但我仍然无法在“UIImageView imageinfo”上显示图像“info1.png”。任何 cmets 都非常感谢!

【问题讨论】:

  • 您的问题可能是您如何使用 alloc init 创建 obic。这很可能是创建 View2Controller 的一个新实例,而不是访问您已有的实例。您需要解释您的 2 个控制器是如何创建的,以及您的控制器的整体层次结构是什么(它们是在导航控制器、拆分视图等中)。
  • 我只是在单击“i”按钮后使用“popover”从 View1Controller 切换到 View2Controller。我刚刚意识到 View1Controller(以及其他一些控制器)嵌入在导航控制器中,但 View2Controller 不是。 View2Controller 是否也应该嵌入到导航控制器中??

标签: ios objective-c delegates uiimageview popover


【解决方案1】:

如果您有一个与信息按钮相关联的弹出转场,则无需创建View2Controller - 转场会为您完成。

你可以去掉 showInfo IBAction 方法,添加一个prepareForSegue: 方法 -

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    View2Controller *obic=(View2Controller)segue.destinationViewController;
    obic.delegate=self;

    UIButton *btn = (UIButton *)sender;


    NSString *imageFilename=nil;

    switch (btn.tag) {
    case 1:
        imageFilename=@"info1.png";
        break;

    case 2:
        //Info View 2
        break;

    case 3:
        //Info View 3
        break;

    case 4:
        //Info View 4
        break;

    case 5:
        //Info View 5
        break;

    case 6:
        //Info View 6
        break;


    default:
        break;
   }

   if (image!=nil)
   { 
       [obic.imageInfo setImage:[UIImage imageNamed:imageFilename]];
   }
   else
   {
       NSLog(@"Unknown button tag triggered segue - %d",btn.tag);
   }
}

此外,您在此处显示的任何内容都不需要 View1Controller 作为 View2Controller 的委托,因此您可能误解了委托的用途。假设 View2Controller 中有一个按钮,您想在按下它时通知 View1Controller - 在 View2Controller 中,您可以调用 [self.delegate theButtonWasPressed]; ,这将在任何委托中调用该方法(可能是实现 View2ControllerDelegate 协议的 View1Controller 实例)

【讨论】:

  • 感谢@Paulw11 的解释,但您建议的代码不起作用。按照您的指示,我删除了“委托”代码并注释掉了 IBAction showinfo。我还删除了“信息”按钮和 View2Controller(我最初创建的)之间的连接。在您对为我创建 ViewController 的 segue 发表评论之后,我这样做了。运行代码时,按下“信息”按钮不会执行任何操作。
  • 不,您需要信息按钮和情节提要中的 View2Controller 场景之间的连接 - 这是您触摸按钮时触发的 segue
【解决方案2】:

解决了!!

正如 Paulw11 代表之前所建议的那样,首先不是要走的路。所以我把委托代码拿出来了。我还拿出了 IBAction showinfo。相反,我使用了方法:

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
   if ([identifier isEqualToString:@"info"]) {
        UIButton *btn = (UIButton *)sender;
    [[NSUserDefaults standardUserDefaults]setInteger:btn.tag forKey:@"infoButton"];
}
return YES;

在 View1Controller 和我添加的 View2Controller 中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *imageArray = @[@"info1.png", @"info2.png", @"info3.png", @"info4.png", @"info5.png", @"info6.png"];
    int infoButtonChoice = [[NSUserDefaults standardUserDefaults] integerForKey:@"infoButton"];

    [self.imageInfo setImage:[UIImage imageNamed:imageArray[infoButtonChoice -1]]];
}

这让应用完全按照我的意愿运行!!

【讨论】:

  • 通过 NSUserDefaults 传递您的按钮编号有点矫枉过正。只需将整数属性添加到 View2Controller 并将其设置在 shouldPerformSegueWithIdentifier 中。您还应该将图像设置移动到 viewWillAppear 而不是 viewDidLoad
猜你喜欢
  • 2021-04-26
  • 2014-08-09
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多