Почему мой пользовательский класс для containerView ничего не делает при распространении приложения?

#ios #objective-c #ios7

#iOS #objective-c #ios7

Вопрос:

Вероятно, это немного локализовано, но у меня возникли проблемы с решением, которое я придумал. У меня есть несколько представлений в моем приложении, и большинство из них имеют одинаковый макет. У них есть нижняя панель с некоторой кнопкой и верхняя панель с заголовком представления, а иногда и кнопка возврата.

Я попытался сделать это с помощью containerView в этих представлениях и одного единственного представления с макетом верхней панели. Затем я вставляю верхнюю панель в containerView моих представлений, которым нужна панель. Работает отлично.

Теперь, чтобы изменить заголовок в верхней панели в соответствии с представлением, в котором пользователь находится в данный момент, я создал UIViewController и назначил его представлению верхней панели. В этом пользовательском контроллере представления у меня есть следующее:

 #import "TopBarViewController.h"
#import "ContactViewController.h"
#import "InboxViewController.h"
#import "OutboxViewController.h"
#import "GalleryViewController.h"
#import "ApproveViewController.h"

@interface TopBarViewController ()

@end

@implementation TopBarViewController

@synthesize viewTitle;
@synthesize backButtonContainer;

UIViewController *topController;

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated {
    //This determines what the currently visible view is, copied from a StackOverflow answer
    UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
        return win1.windowLevel - win2.windowLevel;
    }] lastObject];

    topController = topWindow.rootViewController;
    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    //Here I set the title according to the view the user is in
    //viewTitle is an IBOutlet UILabel and is hooked up via the storyboard
    //backButtonContainer is an IBOutlet UIView and is hooked up via the storyboard
    if ([topController isKindOfClass:[InboxViewController class]]) {
        [viewTitle setText:@"Inbox"];
        [backButtonContainer setAlpha:0.0f];
    }
    else if ([topController isKindOfClass:[ContactViewController class]]) {
        [viewTitle setText:@"Contacten"];
        [backButtonContainer setAlpha:0.0f];
    }
    else if ([topController isKindOfClass:[OutboxViewController class]]) {
        [viewTitle setText:@"Outbox"];
        [backButtonContainer setAlpha:0.0f];
    }
    else if ([topController isKindOfClass:[GalleryViewController class]]) {
        [viewTitle setText:@"Controle verzenden"];
        [backButtonContainer setAlpha:1.0f];
    }
    else if ([topController isKindOfClass:[ApproveViewController class]]) {
        [viewTitle setText:@"Controle beoordelen"];
        [backButtonContainer setAlpha:1.0f];
    }
}

- (IBAction)onBackpressed:(id)sender {
    if ([topController isKindOfClass:[GalleryViewController class]]) {
        [GeneralFunctions gotoView:@"ContactViewController" fromView:self];
    }
    else if ([topController isKindOfClass:[ApproveViewController class]]) {
        [GeneralFunctions gotoView:@"ContactViewController" fromView:self];
    }
}

@end



//This is the gotoView method from GeneralFunctions, also copied from an SO answer
 (void)gotoView:(NSString*)toView fromView:(UIViewController*)fromView {
    NSString * storyboardName = @"main_ipad";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:toView];
    [vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    [fromView presentViewController:vc animated:YES completion:nil];
}
  

Это также работает именно так, как я хочу. Однако, когда я распространяю приложение (собственное распространение), весь этот класс не используется. Я попытался установить alertViews в различных функциях переопределения, но ничего не происходит. Я не понимаю, почему существует разница между прямой компиляцией на устройстве и распространением.

Что я здесь делаю не так?

Я использую xcode 5.1
Я использую iPad 4-го поколения для тестирования под управлением iOS7.1
Я использую iPad 3-го и 4-го поколений, а также iPad Air для тестирования распространяемого приложения

Ответ №1:

Используется isKindOfClass: для тестирования класса экземпляра, а не == .

 if ([topController isKindOfClass:[InboxViewController class]]) {
    ...
} else ...
  

Комментарии:

1. @Kevin Вы спросили: «Что я здесь делаю не так?», Поэтому я ответил. Также вы понимаете разницу между if/else и серией if операторов?

2. Да, я делаю, но здесь это не имеет значения, если экземпляр не может иметь несколько типов классов. Для записи я изменил на isKindOfClass: и изменил if на if else, чтобы быть полностью уверенным. Это не имеет значения. Я согласен, что я должен был использовать isKindOfClass: в первую очередь, но я не думаю, что неправильно использовать == , просто не обычный.

3. @Kevin Хорошо, что касается фактической проблемы с тем, что класс не работает, вам нужно будет добавить точки останова / NSLog() точки в различные моменты жизненного цикла контроллера представления (например, переопределить initWithNibName или awakeFromNib ) и сосредоточиться на коде, который создает экземпляр этого класса, а не на этом конкретном методе.

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

5. Я обновил предоставленный мной код, это полный класс. Здесь мало что нужно сделать, кроме как изменить заголовок и кнопку «Назад».

Ответ №2:

После обновления свойств представления вызов

 [self.view setNeedsDisplay];
  

требовалось для обновления представления. Это сигнализирует о необходимости перерисовки представления с новыми свойствами.