2015-01-21 5 views
0

Я успешно использовал prepareForSegue, который мне удалось передать. Я пытаюсь передать NSNumber через реверс отступки, но prepareForSegue не получает вызов. Чтобы вернуться к моей предыдущей VC я использую:Пропустить NSNumber назад через segue

[self.navigationController popViewControllerAnimated:YES]; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{  
    if ([[segue identifier] isEqualToString:@"ShowImages"]) { 
     DiaryViewController *photoNumber = [segue destinationViewController]; 
     photoNumber.deleteObject = self.rowTodelete; 
} 

Есть ли что-то я могу добавить, чтобы сделать prepareForSegue работать в обратном направлении. Или мне нужно каким-то образом получить доступ к моему NSNumber из другого класса?

+0

Log photoNumber. deleteObject in viewDidAppear. И проверьте, какое значение вы получите, когда вы popViewController. – CRDave

+0

Прошу прощения, пожалуйста, объясните немного больше. Я не понимаю, если бы вы могли дать мне пример кода, было бы замечательно – burrGGG

+0

Просто зарегистрируйте значение photoNumber. deleteObject in viewDidAppear контроллера первого вида. Когда вы выберете DiaryViewController, будет вызываться viewDidAppear и будет напечатан журнал. Проверьте, что это новое значение или нет. – CRDave

ответ

1

Если вы настроили разматывание, вы можете получить UIViewController, который вызывает раскрутку.

Отметьте этот ответ here about Unwind Segues.

После того, как вы на самом деле настроить раскрутку структуру SEGUE, вот некоторые примеры кода размотки переход:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue { 
    UIViewController* sourceViewController = unwindSegue.sourceViewController; 
    if ([sourceViewController isKindOfClass:[DiaryViewController class]] { 
    DiaryViewController *photoNumber = (DiaryViewController *)sourceViewController; 
    NSNumber *deleteObject = photoNumber.deleteObject; 
    } 
} 
+0

Я не увольняю ViewController с действием из UIButton, я вызываю его, когда нажата кнопка на UIAlertView, поэтому я не уверен, как подключить ее, не используя раскадровка и ctrl + перетаскивание из UIButton – burrGGG

+0

Вы также можете программно вызвать программу unind segue. – mbm29414

0

Вы можете также использовать делегат шаблон для него. Просто установите текущий контроллер как делегат целевого контроллера и создайте протокол, определяющий, какой метод должен выполнять делегат. Затем вы можете передать любые параметры, которые вы хотите вернуть в исходный Viewcontroller, если ваш контроллер назначения будет отклонен.

// Source Controller (which is also the delegate of the destination-controller) 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
     SomeController * a = segue.destinationController; 
     a.delegate = self; 
} 
// Delegate Method 
-(void)viewControllerGotDismissed:(NSNumber*)test{ 
     NSlog(@"TEST:%@",test); 
} 

// Destination Controller 
@protocol SomeProtocol 
    -(void)viewControllerGotDismissed:(NSNumber*)test; 
@end 

// Destination Controller 
-(void)viewWillDisappear { 
    // .... 
    [self.delegate viewControllerGotDismissed:@1337]; // Pass the value to the source Controller 
} 
@end 
+0

Я немного смущен. Мой исходный контроллер будет моим вторым ViewController? Я не совсем понимаю, откуда берутся 1337? – burrGGG

+0

Нет, ваш Source-Controller вызывает segue .. который затем представляет destinationController .. вы устанавливаете SourceController внутри prepareForSegue в качестве вашего делегата целевого контроллера, а затем вы можете вызывать метод из вашего целевого контроллера, который может получать данные. 1337 - это просто фиктивные данные, которые я хотел бы передать моему делегату (Sourcecontroller), чтобы показать, как работает шаблон. –

0

Другим способом, который может сработать для вас, является назначение блока завершения для запуска, когда представленное представление отклонено. Например, если A представляет B с интервалом, затем установите блок завершения, когда вы первоначально переходите на B. Когда B собирается уволить, запустите блок завершения.

В ViewControllerB.h

@property (nonatomic, strong) void (^onDismiss)(UIViewController *sender, NSNumber *aNumber); 

В ViewControllerB.m

// execute the block right before A is presented again 
- (void)viewWillDisappear:(BOOL)animated { 
    self.onDismiss(self, aNumberToPassBack); // Run the block 
} 

В ViewControllerA.h

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"SegueToB"]) { 
     ViewControllerB *vcb = [segue destinationViewController]; 

     vcb.onDismiss = ^(UIViewController *sender, NSNumber *aNumber) { 
      self.aNumber = aNumber; 
      // ... update your views if needed 
     }; 
    } 
} 
Смежные вопросы