2014-04-03 77 views
0

这就是我要做的:iOS的显示图像点击

screenshot

在点击“信息(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; 
} 
} 

and

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

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

+0

你的问题可能是你如何用alloc init创建obic。这很可能会创建View2Controller的新实例,而不是访问已有的实例。你需要解释你的2个控制器是如何创建的,以及你的控制器的总体层次结构是什么(它们是否在导航控制器,分割视图等中)。 – rdelmar

+0

一旦单击'i'按钮,我就会使用'popover'从View1Controller切换到View2Controller。 我刚刚意识到View1Controller(以及一些其他控制器)嵌入在导航控制器中,但View2Controller不是。应该将View2Controller嵌入到导航控制器中吗? – hrshd

回答

0

解决!

正如之前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]]]; 
} 

这使得应用程序的工作正是我想要!

+0

通过NSUserDefaults传递你的按钮编号有点矫枉过正。只需将一个整型属性添加到View2Controller并将其设置在shouldPerformSegueWithIdentifier中。您还应该将图像设置移至“viewWillAppear”而不是“viewDidLoad” – Paulw11

1

如果你有一个连接到你的信息按钮的流行歌曲,那么你不需要创建一个View2Controller - segue会为你做到这一点。

可以摆脱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: 
     imageFil[email protected]"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实例)

+0

感谢您的解释@ Paulw11,但您建议的代码无效。按照您的指示,我删除了“委托”代码并注释掉了IBAction showinfo。我也删除了'info'按钮和View2Controller(我最初创建的)之间的连接。我按照你对segue的评论为我创建了一个ViewController。在运行代码时,按下'info'按钮不会执行任何操作。 – hrshd

+0

不,你需要信息按钮和故事板中的View2Controller场景之间的连接 - 这是当你触摸按钮时触发的继续 – Paulw11