2013-08-13 4 views
1

Кажется, у меня возникли трудности с настройкой моего делегата в моем приложении. Я думаю, что это частично связано с тем, что это UIPageView.Правильная настройка делегата

В моей DetailPage (UIPageViewController)

#import "PhotoViewController.h" 

@interface DetailPageController : UIPageViewController <UIPageViewControllerDelegate, PhotoViewControllerDelegate> 

@property (nonatomic, strong) PhotoViewController *photoViewController; 


@end 

И в ом

#import "DetailPageController.h" 
#import "DetailPageModelController.h" 

@interface DetailPageController() 

@end 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.modelController.photos = self.photos; 


    UIViewController *initialController = (UIViewController *)[self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard]; 
    self.delegate = self; 

    [self setViewControllers:@[initialController] 
        direction:UIPageViewControllerNavigationDirectionForward 
        animated:NO 
        completion:^(BOOL finished) { 

        }]; 

} 

- (void)photoCall 
{ 
    NSLog(@"called from photoCall"); 
} 

@end 

Я устанавливающий вид страниц основан от модального, я могу установить контроллер представления и отображает хорошо. Но я не знаю, где назначить моего делегата? Я никогда не выделяю контроллер вида (PhotoViewController) в любом месте.

ModalController.m:

#import "DetailPageModelController.h" 
#import "PhotoViewController.h" 
#import "Media.h" 

@implementation DetailPageModelController 

- (UIImage *)photoAtIndex:(NSUInteger)index { 

    if ([self.photos count] == 0 || index >=[self.photos count]) { 
     return nil; 
    } 

    Media *object = [[Media alloc] init]; 
    object = self.photos[index]; 
    ALAssetRepresentation *rep = [object.asset defaultRepresentation]; 
    CGImageRef iref = [rep fullResolutionImage]; 
    UIImage *image = [UIImage imageWithCGImage:iref]; 

    return image; 

} 

#pragma mark - convenience methods 

- (PhotoViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard 
{ 

    UIImage *photo = [self photoAtIndex:index]; 

    if (photo == nil) { 
     return nil; 
    } 

    //No segue, load manually 
    PhotoViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"PhotoViewController"]; 
    controller.photo = photo; 
    controller.num = index; 

    return controller; 

} 

- (NSUInteger)indexOfViewController:(PhotoViewController *)controller 
{ 
    //Returns the position in array of photos that current picture is 
    //Same as current view controller 
    return controller.num; 
} 

#pragma mark - page view data source 
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController]; 
    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == [self.photos count]) { 
     return nil; 
    } 
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

Тогда фактический вид страницы есть код следующим образом:

PhotoViewController.h

@protocol PhotoViewControllerDelegate <NSObject> 

- (void)photoCall; 

@end 


@interface PhotoViewController : UIViewController 


@property (nonatomic, strong) UIImage *photo; 

//storyboard 
@property (nonatomic, strong) IBOutlet UIImageView *imageView; 

@property (nonatomic, strong) id<PhotoViewControllerDelegate> photoViewControllerDelegate; 

@end 

.m:

#import "PhotoViewController.h" 

@interface PhotoViewController() 

@end 

@implementation PhotoViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self setPhotoView]; 
} 

- (void)setPhotoView 
{ 

    [self.imageView setImage: _photo]; 
    self.imageView.frame = [[UIScreen mainScreen] bounds]; 

} 

- (void)callingHome 
{ 
    NSLog(@"tcd called"); 
    [_photoViewControllerDelegate photoCall]; 
} 

@end 

The метод cal lingHome вызывается нажатием кнопки, я просто пытаюсь найти, где установить этот делегат.

Как я вижу это, он должен работать так:

Button Pressed -> callingHome называется callingHome называется -> _photoViewControllerDelegate вызывает метод PhotoCall в моем основном UIPageView контроллер

Он входит в консоль, и все готово!

+1

Здесь не так много контекста. Когда вы фотографируете V.C. инстанцирован? Когда ваш контроллер просмотра страницы будет ссылаться на него? –

+0

Ах Карл, привет снова. VC создается в контроллере модалов. Если вы посмотрите на главный контроллер PageView, он принимает модальный контроллер, получает индекс текущей страницы и затем тот же индекс из массива фотографий и отображает точные фотографии в контроллере просмотра фотографий. – lostAstronaut

ответ

2

Заменить эти строки:

UIViewController *initialController = (UIViewController *)[self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard]; 
self.delegate = self; 

С

PhotoViewController *initialController = [self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard]; 
initialController.delegate = self; 

А в остальной части вашего приложения, когда вы экземпляр PhotoViewController, чтобы управляться DetailPageController например, убедитесь, чтобы установить страницу контроллер в качестве делегата контроллера просмотра фотографий. Например, изменить UIPageViewControllerDataSource методы, как показано ниже:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 

    index--; 
    PhotoViewController *photoVC = [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
    if ([pageViewController conformsToProtocol:@protocol(PhotoViewControllerDelegate)]) { 
     photoVC.delegate = (id<PhotoViewControllerDelegate>)pageViewController; 
    } 
    return photoVC; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController]; 
    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == [self.photos count]) { 
     return nil; 
    } 

    PhotoViewController *photoVC = [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
    if ([pageViewController conformsToProtocol:@protocol(PhotoViewControllerDelegate)]) { 
     photoVC.delegate = (id<PhotoViewControllerDelegate>)pageViewController; 
    } 
    return photoVC; 
} 

Или изменить ваш метод viewControllerAtIndex:storyboard: принять параметр делегата и выполнить задание там. Однако это удобно для вас - просто убедитесь, что вы назначаете этих делегатов всякий раз, когда вы их создаете, чтобы заходить на ваши страницы.

+0

ДА, вы сэр очень полезны. Работал как шарм. – lostAstronaut

+0

С другой стороны, это работает для текущей страницы, но я просто понял, что она не применяется, когда я прокручиваю страницу или любую другую. – lostAstronaut

+0

Я считаю, что он устанавливает начальный контроллер, но затем этот контроллер исчезает, когда я удаляю его. – lostAstronaut

Смежные вопросы