Наложенный вид с подвидом, не знаю, как вызвать VC

#iphone #objective-c #viewcontroller

#iPhone #objective-c #viewcontroller

Вопрос:

Мне нужно, чтобы представление (InfoView) отображалось как наложение поверх другого представления. Поскольку это информационное представление должно вызываться из любого представления приложения (например, introView), я бы хотел, чтобы код находился в infoViews VC и просто вызывал его методы, когда происходит действие в currentView (introView). Я не могу использовать push и pop, так как мне нужно изменить цвет фона (InfoView) и особенно альфа вызывающего представления (introView), поэтому прямо сейчас я делаю это с помощью insertSubview.

К настоящему моменту мой код: introVC .h

 - (IBAction) openInf:(id)sender;
IBOutlet InfoVC *infoScreenVC;
  

Введение .m

 - (IBAction) openInf:(id)sender {
    [infoScreenVC openInfoMethod];}
  

infoVC .h

 - (IBAction) closeInfoPressed;
- (void) openInfoMethod;
- (void) closeInfoMethod;
  

infoVC .m

 - (IBAction) closeInfoPressed {
    [self closeInfoPressed];}

- (void) closeInfoMethod {
[self.view removeFromSuperview];
[self.xx.view setAlpha:1.0f];}

- (void) openInfoMethod {
self.view.backgroundColor = [UIColor clearColor];
[self.xx.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
    insertSubview: self.infoScreenVC.view aboveSubview: self.xx.view];}
  

Когда я нажимаю кнопку, чтобы отобразить информационное представление, мои NSLogs сообщают мне, что метод был вызван, но я вижу, что вложенное представление не было добавлено. Я абсолютно понятия не имею, что вставить туда, где прямо сейчас написано xx в моем коде, поскольку ссылка на VC из intro не показывает мне экран.
Если я помещу этот код в introVC и изменю его, он действительно покажет InfoView, вызовет правильный метод для закрытия, но снова не сможет закрыться (когда я нахожусь в introVC). Я не могу понять, как сообщить моему приложению, кто был вызывающим VC, чтобы вернуться туда.
В какой-то момент, когда весь код был в introVC, мне удалось даже удалить вложенное представление, но не смог установить альфа-значение introVC обратно в единицу.

Я борюсь с этим уже два дня .. -.- Или, может быть, есть даже более простое решение?

Большое вам спасибо!

// Редактировать после ответа sergios: вступление.m

 - (IBAction) openInf:(id)sender {
introViewController *introVC; 
[infoScreenVC openInfoMethod:];}
  

info.h

 - (void) openInfoMethod:(introViewController *introVC);
  

info.m

 - (void) openInfoMethod:(introViewController *introVC) { //error occurs here
self.view.backgroundColor = [UIColor clearColor];
[self.introVC.view setAlpha:0.2f];
[((MyAppAppDelegate *)[UIApplication sharedApplication].delegate).window 
insertSubview: self.infoScreenVC.view aboveSubview: self.introVC.view];}
  

и возникающая ошибка гласит

 Expected ')' before 'introVC'
  

Я не уверен, как правильно передать ссылку на VC.
Спасибо за вашу помощь!!

// РЕДАКТИРОВАТЬ рабочий код:

Поскольку это работает сейчас, я хотел бы подвести итог: — Я даю вызывающему VC (introVC) openInfoMethod метод для действия openInf like [infoVC openInfoMethod:introVC] .

  • В openInfoMethod я «сохраняю» вызывающий VC в локальной переменной типа introVC (?) и добавляю наложение и т.д.

  • Когда происходит действие InfoViewController с именем closeInfoPressed, он вызывает метод InfoViewController closeInfoMethod, подобный self closeInfoMethod:introVC .

  • В этом методе я удаляю self.view из Superview и устанавливаю альфа-версию introVC.view равной 1, например, introVC.view setAlpha: 1.0f

Итак, кодовые подсказки — это
вступление.h

 IBOutlet InfoscreenViewController *infoScreenVC;

@property (nonatomic, retain) IBOutlet InfoscreenViewController *infoScreenVC;
- (IBAction) openInf:(id)sender;
  

вступление.m

 @synthesize infoScreenVC;
- (IBAction) openInf:(id)sender {
UIViewController *introVC = self;
[infoScreenVC openInfoMethod:introVC];
}
  

info.h:

 - (void) openInfoMethod:(UIViewController *)rootVC;
- (void) closeInfoMethod:(UIViewController *)callingVC;
  

info.m

 - (void) closeInfoMethod:(UIViewController *)callingVC;{
[self.view removeFromSuperview];
[callingVC.view setAlpha:1.0f];
}

- (IBAction) closeInfoPressed{
[self closeInfoMethod:introVC];
[self.view removeFromSuperview];
}
  

Ответ №1:

Если ваша проблема в том, «выясните, как сообщить моему приложению, кто был вызывающим VC, чтобы вернуться туда», почему бы вам не добавить параметр в openInfo selector, как здесь:

info.h

 - (void) openInfoMethod:(introViewController *)introVC;
  

info.m

 - (void) openInfoMethod:(introViewController *)introVC {
    <your implementation here>
}
  

сработает ли это для вас?

РЕДАКТИРОВАТЬ: в вашем коде из intro.m есть небольшая проблема,

 - (IBAction) openInf:(id)sender {
    introViewController *introVC; 
    [infoScreenVC openInfoMethod:];
}
  

действительно, вы не инициализируете свою introVC переменную, так что, когда вы передаете ее в -openInfoMethod: , она будет иметь какое-то странное значение и вызовет сбой.

Насколько я могу понять из вашего кода, intro.m должен быть файл реализации для вашего introViewController , поэтому вы можете просто вызвать:

     [infoScreenVC openInfoMethod:self];
  

но, пожалуйста, прежде чем делать это, подтвердите, что это self действительно ваше introViewController .

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

1. @sergio Спасибо за ваш ответ, это похоже на то, что мне нужно, но я не уверен, как это сделать .. Не могли бы вы быть немного конкретнее? (Кажется, я не могу опубликовать код в комментарии, пожалуйста, посмотрите мою правку для кода, который у меня есть сейчас. Спасибо!

2. @sergio Спасибо тебе! Вот так он компилируется без каких-либо ошибок или предупреждений! Но когда я запускаю приложение, оно вылетает сразу при вызове метода, подобного этому: [infoScreenVC openInfoMethod: introVC];, после того, как я создал ссылку, подобную introViewController * introVC;. Я называю это неправильно (снова)?

3. @sergio Еще раз спасибо! Во introViewController. у Меня есть introViewController * introVC = self; [infoScreenVC openInfoMethod: introVC]; но там происходит сбой. Но это должно быть правильно, не так ли?

4. @Nareille: Я думаю, что да, но вы можете узнать это наверняка, если поставите точку останова для этого вызова и проверите, что introVC имеет правильное значение, которое вы ожидаете. После этого я бы перешел в openInfoMethod: (или поставил точку останова в ее первой строке), отладил шаг за шагом и посмотрел, где и как происходит сбой…

5. @sergio // редактировать: у меня был * introVC с assign-property, с сохранением он работает сейчас. подобное у меня было несколько дней назад (до того, как я все испортил, пытаясь заставить это работать -.-) так что прямо сейчас появляется InfoView, альфа introVC уменьшается до 0.2, и я также могу закрыть InfoView (удалить вложенное представление), но на этом я застрял сейчас. Как определить при закрытии, кем был вызывающий просмотр (introVC)? Спасибо!

Ответ №2:

Это должно быть похоже на это

  • (пустота) openInfoMethod:(introViewController *)introvc вы неправильно передаете параметры.

Ответ №3:

Если я правильно понимаю ваш вопрос, ваш InfoView должен быть подклассом UIView и создаваться с любого из ваших контроллеров просмотра с использованием:

 InfoView *infoView = [[InfoView alloc] initWithFrame:CGRectMake(originX,originY,width,height)];
  

Затем вы просто добавляете его в качестве вложенного представления вашего view controllers view:

 [self.view addSubView:infoView];
[infoView release]; // It's safe to release it here as your view controller's view is retaining it
  

И когда вы закончите с этим, просто вызовите

 [infoView removeFromSuperview];
  

Кроме того, вы могли бы создать несколько простых методов внутри InfoView, которые включают введение анимации при представлении или удалении представления. Вот пример для fade in и out, в котором предполагается, что вы изначально устанавливаете альфа-значение равным нулю при создании представления:

 - (void)fadeIn {
    [UIView animateWithDuration:1.0f animations:^{self.alpha = 1.0f}];
}
  

И исчезаю

 - (void)fadeOut {
    [UIView animateWithDuration:1.0f animations:^{self.alpha = 0f} 
                                     completion:^(BOOL finished){self removeFromSuperView}];
}
  

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

1. Спасибо за ваш ответ! InfoView должен быть UIViewController, так как там также должны быть некоторые кнопки, ведущие к другим представлениям. У меня был аналогичный подход, вначале добавлял и удалял вложенные представления внутри вызывающего VC, но поскольку нужно было добавить больше ViewControllers, мне пришлось настраивать действия для каждого контроллера представления, что не кажется такой уж хорошей идеей, поскольку мне, возможно, придется что-то изменить в InfoView, а затем проверять каждый другой ViewController.. Я буду помнить анимацию и обязательно добавлю ее, как только заработают основные функции!