iCarousel 不显示我的图像目标 C

Posted

技术标签:

【中文标题】iCarousel 不显示我的图像目标 C【英文标题】:iCarousel doesn't show my images objective C 【发布时间】:2016-04-05 07:10:49 【问题描述】:

我想使用 iCarousel 在视图控制器中显示多个图像。

我在 NSMutableArray foto 中列出我所有的图像, 然后我在 iCarousel 方法 viewForItemAtIndex 中调用了数组 foto。 我已经遵循了一些教程,但仍然无法正常工作。 请帮我。

这是我的 .m 代码

#import "TestController.h"

@interface TestController ()  <UIActionSheetDelegate>

@property (nonatomic, retain) NSMutableArray *foto;


@end


@implementation TestController


@synthesize carousel;
@synthesize foto;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
        foto = [NSArray arrayWithObjects:
                     [UIImage imageNamed:@"Seleb1.jpg"],
                     [UIImage imageNamed:@"Seleb2.jpg"],
                     [UIImage imageNamed:@"Seleb3.jpg"],
                     nil];
    
    return self;


- (void)dealloc


    carousel.delegate = nil;
    carousel.dataSource = nil;

- (void)viewDidLoad

    [super viewDidLoad];
    carousel.type = iCarouselTypeCoverFlow2;



- (void)viewDidUnload

    [super viewDidUnload];

    self.carousel = nil;



#pragma mark -
#pragma mark iCarousel methods

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel

    return [foto count];




- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

    view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[foto objectAtIndex:index]]];
    return view;


@end

有人可以帮助我吗? 我的代码有什么问题?

更新代码

#import "TestController.h"

@interface TestController ()  

@property (nonatomic, retain) NSArray *foto;


@end


@implementation TestController


@synthesize carousel;
@synthesize foto;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
        foto = [NSArray arrayWithObjects:
                @"Seleb1.jpg",
                @"Seleb2.jpg",
                @"Seleb3.jpg",
                nil];
    
    return self;



- (void)dealloc


    carousel.delegate = nil;
    carousel.dataSource = nil;

- (void)viewDidLoad

    [super viewDidLoad];
    carousel.type = iCarouselTypeCoverFlow2;
    [carousel reloadData];


- (void)viewDidUnload

    [super viewDidUnload];

    self.carousel = nil;




#pragma mark -
#pragma mark iCarousel methods

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel

    return [foto count];



- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 

    view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)]; // set the frame for your Image

    UIImage *image  = [UIImage imageNamed:[foto objectAtIndex:index]];
    ((UIImageView *)view).image = image;

    return view;



- (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option          withDefault:(CGFloat)value

    //customize carousel display

    return value+0.1;


@end

【问题讨论】:

您没有将 iCarousel 的代理或数据源设置为视图控制器。 @TomKnapen:我应该在哪里设置它?如果它在故事板上,我已经设置好了。在 TestController.h 中,我也设置了它,这是我在 .h 中的代码: TestController : UIViewController 在这种情况下,你不应该打电话给[carousel reloadData](例如在你的viewDidLoad)吗? @TomKnapen :我尝试在 viewDidLoad 方法中添加 [carousel reloadData],但仍然不起作用 【参考方案1】:

改变这一行

 view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[foto objectAtIndex:index]]];

原因:你已经将你的数组定义为[UIImage imageNamed:@"Seleb1.jpg"],所以在这里你需要直接调用

view = [[UIImageView alloc] initWithImage:[foto objectAtIndex:index]];

选择 2

创建一个类似的数组

  foto = [NSArray arrayWithObjects:
                 @"Seleb1.jpg",
                 @"Seleb2.jpg",
                 @"Seleb3.jpg",
                 nil];

然后打电话

 view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[foto objectAtIndex:index]]];

如果你需要

使用这个

- (void)viewDidLoad

[super viewDidLoad];
carousel.type = iCarouselTypeCoverFlow2;
[carousel reloadData];

更新答案

  - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 

    view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)]; // set the frame for your Image

          UIImage *image  = [UIImage imageNamed:[foto objectAtIndex:index]];
        ((UIImageView *)view).image = image;

        return view;


【讨论】:

不错,但我认为这应该补充[carousel reloadData] @TomKnapen -- 我认为这里不需要这个,但如果我们使用它会受益 @TomKnapen - tanx 好友 @Anbu.Karthik 我尝试了两种选择,但它仍然不起作用:( 嗯,我知道了,请稍等【参考方案2】:

@TomKnapen:我应该在哪里设置它?如果它在故事板上,我已经 已经设置好了。在 TestController.h 中,我也设置了这是我的 .h 中的代码:TestController:UIViewController – Shasapo

我不确定您如何在情节提要中设置它,但在代码中,您没有设置委托。此行没有设置委托TestController : UIViewController &lt;iCarouselDataSource,iCarouselDelegate&gt;,它的作用是让您成为控制器,在本例中为 TestController,遵守 iCarouselDelegate 协议。您要做的就是在viewDidLoad 中显式设置委托和数据源,例如,即

carousel.delegate = self;

carousel.datasource = self;

2 - 首先尝试调试这些委托方法。从 nimberOfItems 方法开始,检查 foto 数组是否为零。然后在 viewForItem 方法中检查您返回的图像是否不为零。 因为您使用的是故事板,所以您的 initWithNibName 方法没有被调用,这就是为什么您的 foto 数组没有被初始化,我假设。在我看来,您的 numberofitems 方法返回 0。尝试在此方法中放置断点并查看,或者只是添加一个 NSLog 语句并检查 foto 数组是否为 nil

3 - 您没有将 iCarousel 视图添加到您的视图中。

我过去使用过这个框架,所以我决定包含我实现的代码的 sn-p

#pragma mark -
#pragma mark iCarousel methods

- (void)iCarouselSetup 
    self.view.backgroundColor = kAppColor;

    self.carousel = [[iCarousel alloc] initWithFrame:CGRectMake(0, calendarBar.bottom + 10, self.view.width, self.view.height)];
    [self.view addSubview:self.carousel];

    self.carousel.delegate = self;
    self.carousel.dataSource = self;
    self.carousel.type = iCarouselTypeCoverFlow;
    self.carousel.scrollEnabled = NO;
    [self.carousel scrollToItemAtIndex:2 animated:NO];

    self.currentProjectsTableview = (UITableView*)[self.carousel currentItemView]; 

- (NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel 
    return 5; 

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view 
    self.projectsTableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) style:UITableViewStylePlain];
    self.projectsTableview.x = 0;
    self.projectsTableview.y = calendarBar.bottom;
    self.projectsTableview.width = [ASize screenWidth];
    self.projectsTableview.height = [ASize screenHeight] - 180;
    self.projectsTableview.contentInset = UIEdgeInsetsMake(0, 0, 100, 0);
    self.projectsTableview.backgroundColor = [UIColor fromRGB:0xF8F8F8];
    self.projectsTableview.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.projectsTableview.dataSource = self;
    self.projectsTableview.delegate = self;
    self.projectsTableview.tag = tableTag++;

    return self.projectsTableview; 

- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index 
    self.carousel.scrollEnabled = NO;
    [AppDelegate getDelegate].deckController.panningMode = IIViewDeckFullViewPanning;

    [UIView animateWithDuration:0.3 animations:^
        for (int i = 0; i < self.carousel.numberOfItems; i++)
        
            [self.carousel itemViewAtIndex:i].transform = CGAffineTransformMakeScale( 1.1f, 1.1f);
        
    completion:^(BOOL finished) 
        [UIView animateWithDuration:0.2 animations:^
            for (int i = 0; i < self.carousel.numberOfItems; i++)
            
                [self.carousel itemViewAtIndex:i].transform = CGAffineTransformMakeScale( 1.0f, 1.0f);
                [self.carousel itemViewAtIndex:i].userInteractionEnabled = YES;
            
         ];
        tableMinimized = NO;
    ];

    self.currentProjectsTableview = (UITableView*)[carousel itemViewAtIndex:index]; 

- (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel 
    [navButton setTitle:self.projectDates[self.carousel.currentItemIndex] forState:UIControlStateNormal]; 

【讨论】:

先尝试调试那些委托方法。从 nimberOfItems 方法开始,检查 foto 数组是否为零。然后在 viewForItem 方法中检查您返回的图像是否不为零。 因为您使用的是故事板,所以您的 initWithNibName 方法没有被调用,这就是为什么您的 foto 数组没有被初始化,我假设。在我看来,您的 numberofitems 方法返回 0。尝试在此方法中放置断点并查看,或者只是添加一个 NSLog 语句并检查 foto 数组是否为 nil 是的,我尝试打印 foto.count 并返回 0。我应该在哪里放置断点?顺便问一下断点是什么? 断点用于调试,使程序停在代码中放置断点的那一点。但你现在不需要它,因为我指出了问题所在。现在你需要做的是摆脱那个 initwithnib 方法并使用一个简单的 init 方法并在那里创建你的 foto 数组,或者只是在 viewdidload 中创建它。并检查了我在原始答案中包含的代码 sn-p。 是的,现在可以了,我在 viewDidLoad 中移动了 foto 数组,现在可以了,谢谢,我会更新我的答案【参考方案3】:

我通过结合您所有的答案来修复我的代码,非常感谢。这是我的新代码:

#import "TestController.h"

@interface TestController ()  

@property (nonatomic, retain) NSArray *foto;


@end


@implementation TestController


@synthesize carousel;
@synthesize foto;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization

    
    return self;



- (void)dealloc


    carousel.delegate = nil;
    carousel.dataSource = nil;

- (void)viewDidLoad

    carousel.delegate = self;

    carousel.dataSource = self;
   foto = [NSArray arrayWithObjects:
                   @"Seleb1.jpg",
                   @"Seleb2.jpg",
                   @"Seleb3.jpg",
                   nil];


    [super viewDidLoad];
    carousel.type = iCarouselTypeCoverFlow2;
    [carousel reloadData];




- (void)viewDidUnload

    [super viewDidUnload];

    self.carousel = nil;




#pragma mark -
#pragma mark iCarousel methods

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel

    NSLog(@"%lu",(unsigned long)foto.count);
    return [foto count];



- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 

    view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 200.0f)]; // set the frame for your Image

    UIImage *image  = [UIImage imageNamed:[foto objectAtIndex:index]];
    ((UIImageView *)view).image = image;

    return view;



- (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option          withDefault:(CGFloat)value

    //customize carousel display

    return value+0.1;


@end

非常感谢您的所有回答,我真的很感激:)

【讨论】:

以上是关于iCarousel 不显示我的图像目标 C的主要内容,如果未能解决你的问题,请参考以下文章

要显示的起始图像的 iCarousel 索引号

无法从 web url 向 iCarousel 显示图像

iCarousel 滚动不流畅

icarousel 图像大小是多少

如何在 iOS 的 iCarousel 中显示图像全屏?

iCarousel 显示来自图像 URL 数组的图像