#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];
требовалось для обновления представления. Это сигнализирует о необходимости перерисовки представления с новыми свойствами.